[英]Programming on the data.table with "env" in a function
I am interested in joining two data.tables in a function. However, when using the new env
for programming on the data.table, I am unable to join the data.tables in a function because the argument I attempt to join on does not exist, ie I get a "argument specifying columns received non-existing columns" error.我有兴趣加入 function 中的两个 data.tables。但是,当在env
上使用新环境进行编程时,我无法加入 function 中的 data.tables,因为我尝试加入的参数不存在,即我收到“指定列的参数接收到不存在的列”错误。 How can I programmatically feed the matching column for joining two data.tables into a function?如何以编程方式将用于连接两个 data.tables 的匹配列输入 function? I provide a minimal working example of a surprising failure below.我在下面提供了一个令人惊讶的失败的最小工作示例。
dt.mwe.1 <- data.table(a = c(1,2,3,4,0,10))
mwe_function = function(dt, merge_var){
dt.internal =
data.table(z = min(dt):max(dt)) %>%
.[ , .(mv = z) , env = list(mv = merge_var)] %>% `[`
dt.internal2 =
data.table(z = min(dt):max(dt)) %>%
.[ , .(mv = z) , env = list(mv = merge_var)] %>% `[`
dt.internal
dt.internal[dt.internal2, on = .(mv),
env = list(mv = merge_var)] %>% `[`
}
# fails
mwe_function(dt = dt.mwe.1, merge_var = "a")
# also fails
mwe_function(dt = dt.mwe.1, merge_var = a)
Maybe I am missing your point, but what about:也许我想念你的意思,但是:
mwe_function = function(dt, merge_var){
dt.internal =
data.table(z = min(dt):max(dt)) %>%
.[ , .(mv = z) , env = list(mv = merge_var)] %>% `[`
dt.internal2 =
data.table(z = min(dt):max(dt)) %>%
.[ , .(mv = z) , env = list(mv = merge_var)] %>% `[`
dt.internal
dt.internal[dt.internal2, on = merge_var] %>% `[`
}
mwe_function(dt = dt.mwe.1, merge_var = "a")
# a
# <int>
# 1: 0
# 2: 1
# 3: 2
# 4: 3
# 5: 4
# 6: 5
# 7: 6
# 8: 7
# 9: 8
# 10: 9
# 11: 10
From the help of ?data.table
:在?data.table
的帮助下:
env: List or an environment, passed to 'substitute2' for substitution of parameters in 'i', 'j' and 'by' (or 'keyby'). Use 'verbose' to preview constructed expressions.
So I guess the env
approach does not work on the on
argument, which, however, accepts anyways strings as input.所以我猜env
方法不适用于on
参数,但是无论如何,它接受字符串作为输入。
mwe_function = function(dt, merge_var){
merge_var <- as.character(substitute(merge_var))
dt.internal =
data.table(z = min(dt):max(dt)) %>%
.[ , .(mv = z) , env = list(mv = merge_var)] %>% `[`
dt.internal2 =
data.table(z = min(dt):max(dt)) %>%
.[ , .(mv = z) , env = list(mv = merge_var)] %>% `[`
dt.internal
dt.internal[dt.internal2, on = merge_var] %>% `[`
}
mwe_function(dt = dt.mwe.1, merge_var = a)
# a
# <int>
# 1: 0
# 2: 1
# 3: 2
# 4: 3
# 5: 4
# 6: 5
# 7: 6
# 8: 7
# 9: 8
# 10: 9
# 11: 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.