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