R .SD-lappy可能存在错误?
使用data.table版本1.8.8。为什么这样做有效: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作为函数的参数,以避免依赖
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
内。