.SD lapply的可能错误?

时间:2013-09-18 14:47:36

标签: r data.table

使用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

我缺少什么?

2 个答案:

答案 0 :(得分:3)

我不会称这是一个错误 - 当您致电f时,ab作为名为vectors x传递给它}。 (更准确地说,.SD正在通过)

因此,虽然ab存在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)]

这避免了范围问题。