R data.table的包装函数在本地环境中不起作用

R data.table的包装函数在本地环境中不起作用,r,data.table,environment,subset,R,Data.table,Environment,Subset,考虑以下功能: test <- function(x,...) { # in practical case, it does more x[...] } 我如何修改test(),以便它可以使用…和数据的子集。表 我的会话信息: > sessionInfo() R version 3.1.1 (2014-07-10) Platform: x86_64-w64-mingw32/x64 (64-bit) locale: [1] LC_COLLATE=English_United

考虑以下功能:

test <- function(x,...) {
  # in practical case, it does more
  x[...]
}
我如何修改
test()
,以便它可以使用
数据的子集。表

我的会话信息:

> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2

loaded via a namespace (and not attached):
[1] plyr_1.8.1    Rcpp_0.11.2   reshape2_1.4  stringr_0.6.2 tools_3.1.1  

这是有道理的,因为data.table的
[…]
采用了在parent.frame中计算的表达式。因此,在本例中,
J(i)
将在
test()
的环境中进行计算,因为它是从那里调用的。由于在全局环境中定义了
test()
,因此默认情况下,将在全局环境中搜索在
test()
中未找到的任何变量。
test()
函数实际上与您创建的本地环境无关。您可以更改要在其parent.frame中计算的
test()
函数。比如说

test <- function(x,...) {
    cc <- match.call()
    cc[[1]] <- quote(`[`)
    names(cc)[2]<-"" #make data.frame happy
    eval.parent(cc)
}

test我没有得到错误,无论是使用
test
还是
[
在这两种设置中都使用。使用数据。R3.1.0中的表1.9.2。@BondedDust,我使用的是数据。R3.1.1中的表1.9.2编写维护程序。嗯,…9个小时……你是一个相当不耐烦的男孩,不是吗?
[.data.frame
[.data.table
工作在实践方面有很大的不同(在
data.table
中使用非标准评估),并且使用有状态的缺失参数是data.frames的
x[i];x[i,];x[i,,drop=FALSE]
之间的区别。需要的是某种明智地处理这些情况的方法(对于
data.frame
data.table
可能有不同的方法。您认为data.frame工作正常的观点是正确的,因为它不会返回错误,但不会返回相同的过滤。这是对环境问题的一个很好的描述。
> sessionInfo()
R version 3.1.1 (2014-07-10)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.9.2

loaded via a namespace (and not attached):
[1] plyr_1.8.1    Rcpp_0.11.2   reshape2_1.4  stringr_0.6.2 tools_3.1.1  
test <- function(x,...) {
    cc <- match.call()
    cc[[1]] <- quote(`[`)
    names(cc)[2]<-"" #make data.frame happy
    eval.parent(cc)
}
library(data.table)
m <- data.table(x=1:3,key="x")    
n <- data.frame(x=1:3)
local({i <- 1; m[J(i)]})
#    x
# 1: 1

local({i <- 1; test(m, J(i))})
#    x
# 1: 1

local({i <- 1; test(n, i)})
#   x
# 1 1
# 2 2
# 3 3

i<-2
test(m, J(i))
#    x
# 1: 2