对于不是函数的变量,类型(闭包)无效

时间:2017-07-27 21:01:41

标签: r loess

loess.smooth <- function(dat) {
  dat <- dat[complete.cases(dat),]

  ## response
  vars <- colnames(dat)
  ## covariate
  id <- 1:nrow(dat)
  ## define a loess filter function (fitting loess regression line)
  loess.filter <- function (x, span) loess(formula = paste(x, "id", sep = "~"),
                                           data = dat,
                                           degree = 1,
                                           span = span)$fitted 
  ## apply filter column-by-column
  new.dat <- as.data.frame(lapply(vars, loess.filter, span = 0.75),
                           col.names = colnames(dat))
}

当我尝试将loess.smooth应用于数据框时,出现错误:

 Error in model.frame.default(formula = paste(x, "id", sep = "~"), data = dat) : 
  invalid type (closure) for variable 'id' 

我不明白为什么这是一个问题,因为id不是一个函数,这是错误所暗示的。 当我在函数之外运行这些代码行时,它的工作完全正常,完全符合我的要求。

1 个答案:

答案 0 :(得分:1)

这是一个范围问题,涉及将字符串向量传递给loess函数,而不是传递公式的向量。问题是环境会为前者返回NULL,因此loess不知道在哪里找到它。如果你将公式包装在as.formula中就可以了。默认情况下,此变量将在函数调用中分配本地环境。

对于神秘错误,当你从另一个加载的包中命名一个给定函数的相同名称的变量时会发生这种情况,因为如果函数在本地环境中找不到变量,那么它将是范围在加载的函数包中。在我的例子中,id函数加载了dplyr函数。