Как исправить объект (…), не найденный, пока он объявлен в R

#r #loops

#r #циклы

Вопрос:

Я пытаюсь получить производную от функции двойной суммы. Я сталкиваюсь с этой ошибкой:

 Error in deriv.f.1(X = X.data, y = y.vec, alpha = alpha.vector[1, ]) : 
  object 'L_D_grad' not found
  

Я попытался переместить {} скобки, дважды проверьте, не пропустил ли я закрывающую / размыкающую скобку, есть ли у меня дополнительная открывающая / закрывающая скобка. Однако ошибка все еще существует.

 # Generate Sample Data
gen.sample <- function(n){
  x <- rnorm(n,5,10)
  y <- ifelse(x < 2.843,1,-1)
  return(data.frame(x,y))
}
##
deriv.f.1 <- function(X,y,alpha){
  N <- length(X)
  L_D_grad < numeric(N)
  xy.alpha.sum <- numeric(N)
  for(k in 1:N){
    for(l in 1:N){
      if(l == k){
        xy.alpha.sum[l] = 0}  
      else{
        xy.alpha.sum[l] <- alpha[l]*y[k]*y[l]*X[k]*X[l]}
      }
  L_D_grad[k] <- 1 - sum(xy.alpha.sum) - alpha[k]*(y[k])^2*(X[k])^2
  }
  return(L_D_grad)
}
## Illustration

set.seed(4997)
options(digits = 4,scipen = -4)
sample.data <- gen.sample(n=N)
X.data <- sample.data$x
y.vec <- sample.data$y

alpha.vector <- matrix(rep(seq(from=-5,to = 5, length.out = N),N*N),
                       ncol = N, nrow = N, byrow = TRUE)
alpha_vec <- alpha.vector[1,]
deriv.f.1(X = X.data, y = y.vec, alpha =  alpha_vec)
  

Заранее спасибо!

Ответ №1:

Вот мой код:

 # Generate Sample Data
gen.sample <- function(n){
  x <- rnorm(n,5,10)
  y <- ifelse(x < 2.843,1,-1)
  return(data.frame(x,y))
}
##
deriv.f.1 <- function(X,y,alpha){
  N <- length(X)
  L_D_grad <- numeric(N)
  xy.alpha.sum <- numeric(N)
  for(k in 1:N){
    for(l in 1:N){
      if(l == k){
        xy.alpha.sum[l] = 0}  
      else{
        xy.alpha.sum[l] <- alpha[l]*y[k]*y[l]*X[k]*X[l]}
    }
    L_D_grad[k] <- 1 - sum(xy.alpha.sum) - alpha[k]*(y[k])^2*(X[k])^2
  }
  return(L_D_grad)
}
## Illustration

set.seed(4997)
options(digits = 4,scipen = -4)
N=10
sample.data <- gen.sample(n=N)
X.data <- sample.data$x
y.vec <- sample.data$y

alpha.vector <- matrix(rep(seq(from=-5,to = 5, length.out = N),N*N),
                       ncol = N, nrow = N, byrow = TRUE)
alpha_vec <- alpha.vector[1,]
deriv.f.1(X = X.data, y = y.vec, alpha =  alpha_vec)
  

Где:

 #sample.data
#x  y
#1  -5.303e 00  1
#2   1.493e 01 -1
#3   9.797e 00 -1
#4   1.991e 01 -1
#5  -1.454e 01  1
#6   1.423e 01 -1
#7   1.025e 01 -1
#8   5.455e 00 -1
#9   3.719e 00 -1
#10  2.021e 01 -1
  

И deriv.f.1(X = X.data, y = y.vec, alpha = alpha_vec)

 # -1.271e 01 -3.759e 01 -2.432e 01 -5.046e 01 -3.659e 01 -3.577e 01 -2.548e 01 -1.310e 01
# -8.612e 00 -5.123e 01
  

Я внес два изменения:

  1. Присвойте N значение: N=10
  2. Правильная форма назначения L_D_grad : L_D_grad <- numeric(N)

Комментарии:

1. Да, вам было назначено L_D_grad < numeric(N) . Вам просто нужно изменить < для <-

2. Знаете ли вы, сколько глупостей я совершил с тех пор, как начал этот проект самостоятельно? Бесчисленное множество! Спасибо, брат!