r - .SD 和 data.table 的其他类似特殊变量的命名空间环境是什么?

标签 r data.table

我知道在 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/

相关文章:

r - 如何删除数据框中的行?

r 语言 - sqldf 包看不到我的任何数据文件

r - aggregate() 是否保证结果将按分组列排序?

r - 高效计算 data.table 列的线性组合

r - 一个 data.table 列的最大值基于其他列

r - 将函数标记为 data.table-unaware

reshape 数据以与 geeglm() 一起使用

r - 在Rcpp中对命名的数值向量进行排序

r - 通过不在该 data.table 中的列通过行扩展 R data.table?

r - 如何在函数内部使用data.table?