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

Invalid type (closure) for a variable that is not a function

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 不是函数,错误暗示了这一点。 当我 运行 通过函数外部的这些代码行时,它工作得非常好并且完全按照我的意愿去做。

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

至于神秘错误,当您将变量命名为与加载的另一个包中给定函数相同的名称时,就会发生这种情况,因为如果函数在本地环境中找不到变量,它将作用域在函数的加载包中。在我的例子中,id 函数由 dplyr 库加载。