2

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

有什么我想念的吗?

4

2 回答 2

3

我不会完全称其为错误 - 当您调用时fab作为被调用传递给vectorsx。(更准确地说,.SD正在通过)

所以 whileab存在于 内j,你的函数的主体f不会在 内评估j

为了说明,看看你运行时会发生什么

with(dat, f(a))

我建议只b对函数进行一个参数,以避免依赖于名称的一致性。

f = function(x,b) x * b
dat[,sapply(.SD, f, b=b)]
于 2013-09-18T15:39:58.037 回答
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)]

这避免了范围界定问题。

于 2013-09-18T15:43:11.580 回答