我知道在 R 中,如果变量未在函数中定义,则会在上游搜索。所以我认为对于特殊data.table
应该是这样的。变量,如 .SD
, .N
等等,但这段代码不起作用:
data(iris)
setDT(iris)
myFunA <- function(){
return(nrow(.SD))
}
iris[,myFunA(),by=Species]
有什么方法可以联系到.SD
从函数内部,不将其作为参数传递,如 myFunA(.SD)
? (是的,我知道这通常不是一个好习惯,但对于这个用例,我会纵容它)
最佳答案
不幸的是,似乎 .SD 虽然可访问,但在 myFunA 运行时并未填写。 .N 虽然在下面的 myFunB 中可用,但问题中的特定示例可以像在 myFunB 中一样进行修改以使其工作。
问题似乎是data.table优化了计算,如果认为没有使用.SD就避免填写。如果我们确实使用它,那么它可以像下面的 myFunC 一样工作。
library(data.table)
irisDT <- as.data.table(iris)
myFunA <- function(envir = parent.frame()) with(envir, .SD)
irisDT[, myFunA(), by = Species]
## Empty data.table (0 rows and 1 cols): Species
myFunB <- function(envir = parent.frame()) with(envir, .N)
irisDT[, myFunB(), by = Species]
## Species V1
## 1: setosa 50
## 2: versicolor 50
## 3: virginica 50
myFunC <- function(envir = parent.frame()) with(envir, nrow(.SD))
irisDT[, {.SD; myFunC()}, by = Species]
## Species V1
## 1: setosa 50
## 2: versicolor 50
## 3: virginica 50
关于r - .SD 和 data.table 的其他类似特殊变量的命名空间环境是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67339896/