R语言 函数中的变量不用作值

mwg9r5ms  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(139)

我在R中使用了robust.arima包,当我在脚本中调用它时,它工作正常。但是,我想组织我的文件,因此在函数中调用robust arima。这里突然找不到变量。让我给予个例子

# Works fine
ts_list <- rnorm(100)
arima.rob(ts_list~1)

# Breaks down
get_rob_estimate <- function(x){
    out <- arima.rob(x~1)
    return(out)

ts_list <- rnorm(100)
get_rob_estimate(ts_list)

Error in eval(formula[[2]]) : object 'x' not found

有人知道这是怎么回事吗?我认为这个问题看起来和R : Pass argument to glm inside an R function很相似,但我仍然想不通,我很好奇R是如何处理这些函数的?

  • 编辑 *

好吧,基本的选择,我现在明白了,但我不明白为什么它有效。如果我有

check_func <- function(ind_ts){
  out <- substitute(arima.rob(ind_ts~1))
  return(eval(out))
}

analyze_ts <- function(){
  df <- mvrnorm(100, mu=c(0,0,0), Sigma=diag(c(1,1,1)))
  p <- list()
  for (i in ncol(df)){
    sel <- df[,i]
    check_func(sel)
    p <- append(p, sel)
  }
  return(p)
}

analyze_ts()

然后得到错误
Error in eval(formula[[2]]) : object 'sel' not found
它是怎么工作的,这里发生了什么,我只是想让我的列表,在我的函数中,作为一个列表,应该不是很难,对吧,不管它经过多少个函数?

rsaldnfx

rsaldnfx1#

使用substitute()

get_rob_estimate <- function(x) {
  out <- substitute(robustarima::arima.rob(x ~ 1))
  return(eval(out))
}

get_rob_estimate(ts_list)
# Call:
# robustarima::arima.rob(formula = ts_list ~ 1)
# 
# Regression Coefficients:
#   (Intercept) 
#        0.1032 
# 
# Degrees of freedom: 100 total; 99 residual
# Innovations standard deviation: 0.9832 
# 
# Number of outliers detected:  1
# 
# Outlier index
# [1] 59
# 
# Outlier type
# [1] "AO"
# 
# Outlier impact
# [1] -3.0963
# 
# Outlier t-statistics
# [1] 3.1493

编辑

你可以这样正确地编写Arima Package 器:

analyze_ts <- function(){
  df <- MASS::mvrnorm(100, mu=c(0, 0, 0), Sigma=diag(c(1, 1, 1)))
  for (i in seq_len(ncol(df))) {
    sel <- df[,i]
    sel <- check_func(sel)
    p <- append(p, sel)
  }
  return(p)
}

更好地使用lapply

analyze_ts <- function() {
  df <- MASS::mvrnorm(100, mu=c(0, 0, 0), Sigma=diag(c(1,1,1)))
  return(lapply(seq_len(ncol(df)), \(i) check_func(df[,i])))
}
  • 使用方法:*
set.seed(42) ## for sake of reproducibility
analyze_ts()
  • 数据:*
set.seed(42)
ts_list <- rnorm(100)

相关问题