【问题标题】:Invalid type (closure) for a variable that is not a function不是函数的变量的无效类型(闭包)
【发布时间】:2017-07-27 21:01:40
【问题描述】:
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 不是一个函数,这是错误所暗示的。 当我在函数之外运行这些代码行时,它工作得非常好,并且完全符合我的要求。

【问题讨论】:

    标签: r loess


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2018-04-18
      • 1970-01-01
      相关资源
      最近更新 更多