使用data.table版本1.8.8。为什么这样做:
dat <- data.table(a=1:5,b=5:1)
sdat <- dat[,lapply(.SD,function(x) x*b)]
但是这个
dat <- data.table(a=1:5,b=5:1)
f <- function(x) x*b
sdat <- dat[,lapply(.SD,f)]
给出
Error in FUN(X[[1L]], ...) : object 'b' not found
我缺少什么?
答案 0 :(得分:3)
我不会称这是一个错误 - 当您致电f
时,a
和b
作为名为vectors
x
传递给它}。 (更准确地说,.SD
正在通过)
因此,虽然a
和b
存在j
,但您的函数f
的正文未在j
内进行评估。
为了说明,看看运行时会发生什么
with(dat, f(a))
我建议只使b
成为函数的参数,以避免在未来依赖名称一致性。
f = function(x,b) x * b
dat[,sapply(.SD, f, b=b)]
答案 1 :(得分:1)
如果使用lapply
:
library(data.table)
dat <- data.table(a=1:5, b=5:1)
f <- function(x, b) x*b
sdat <- dat[,lapply(.SD ,f, b=b)]
这避免了范围问题。