不是函数的变量的无效类型(闭包)
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
库加载。
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
库加载。