R .SD-lappy可能存在错误?

R .SD-lappy可能存在错误?,r,data.table,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)] 我遗漏了什么?我不太会称之为bug-当你调用f时,a和b作为向量传递给它,称之为x。(更准确地说,.SD正在被传递) 因此,虽然a和b存在于j中,但函数体f不会在j中计算 为了举例说明,请查看运行时发生的情况 with(dat, f(a)) 我建议将b作为函数的参数,以避免依赖

使用data.table版本1.8.8。为什么这样做有效:

dat <- data.table(a=1:5,b=5:1)
sdat <- dat[,lapply(.SD,function(x) x*b)]

我遗漏了什么?

我不太会称之为bug-当你调用
f
时,
a
b
作为
向量
传递给它,称之为
x
。(更准确地说,
.SD
正在被传递)

因此,虽然
a
b
存在于
j
中,但函数体
f
不会在
j
中计算

为了举例说明,请查看运行时发生的情况

with(dat, f(a))
我建议将
b
作为函数的参数,以避免依赖于名称的一致性

f = function(x,b) x * b
dat[,sapply(.SD, f, b=b)]

我不认为这是一个bug——当你调用
f
时,
a
b
被作为
向量
传递给它,称之为
x
。(更准确地说,
.SD
正在被传递)

因此,虽然
a
b
存在于
j
中,但函数体
f
不会在
j
中计算

为了举例说明,请查看运行时发生的情况

with(dat, f(a))
我建议将
b
作为函数的参数,以避免依赖于名称的一致性

f = function(x,b) x * b
dat[,sapply(.SD, f, b=b)]

如果使用
lappy
,则应始终明确传递变量:

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)]
库(data.table)

dat如果使用
lappy
,则应始终明确传递变量:

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)]
库(data.table)

dat我猜这是范围,不是bug,你的第二个
f
找不到
b
,因为它在定义它的环境中查找对象,而不是在
dat
中。我猜这是范围,不是bug,你的第二个
f
找不到
b
,因为它在定义它的环境中查找,不在对象的
dat
内。