Data.table和get()命令(R)
在函数中包含Data.table和get()命令(R),r,function,data.table,R,Function,Data.table,在函数中包含data.table操作时出现问题。输入参数是data.table名称和列/变量名称 我可以使用get()命令来引用data.table。但是,对变量名使用相同的命令是行不通的。我知道get()在列/变量名的情况下可能不合适,但我一直在考虑使用哪个命令 编辑:我现在加入了substitute()而不是get(),但仍然不起作用 toy_example_fun <- function(d, .expr){ .expr = substitute(.expr) setke
data.table
操作时出现问题。输入参数是data.table名称和列/变量名称
我可以使用get()
命令来引用data.table。但是,对变量名使用相同的命令是行不通的。我知道get()
在列/变量名的情况下可能不合适,但我一直在考虑使用哪个命令
编辑:我现在加入了substitute()
而不是get()
,但仍然不起作用
toy_example_fun <- function(d, .expr){
.expr = substitute(.expr)
setkey(get(d), .expr) # ==> doesn't work
d.agg <- get(d)[,list(sum(y), sum(v)), by=.expr] # --> works
}
toy_example_fun("DT", x)
尽管如此,后一种选择仍然有效variable,您可以这样做:
someFun <- function(d, .expr){
group <- substitute(.expr)
get(d)[,list(sum(y), sum(v)), by=group]
}
someFun("DT", x)
group V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
someFun("DT", "x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
但是一些有趣的事情(“DT”,x)
就行不通了。所以阿德里的回答更一般
使用setkeyv
someFun <- function(d, cols){
setkeyv(get(d), cols)
cols <- substitute(cols)
get(d)[,list(sum(y), sum(v)), by=cols]
}
someFun("DT", "x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
一些有趣的重复,谢谢你让我参考你的帖子,安德里。但是,如果我使用substitute()
,它仍然无法工作。请在链接问题的答案中加入建议来编辑您的问题-否则您可能会将其作为副本关闭。完成。再次感谢您的评论。这仍然是重复的。您应该使用链接答案中解释的quote(x)
。谢谢,Andrie和Matthew。你的回答对我帮助很大。但是,在最后一个函数中,我还需要使用setkey()
命令。当另一部分工作时,setkey(get(d),.expr)
行仍然不工作。事实上,这就是我困惑的原因(我从来没有看过聚合,因为我首先从setkey()
中得到了错误。)@majom Try?setkeyv
(末尾额外的v)。这太完美了。非常感谢!我真的很感谢你的帮助。完成了。谢谢你的提示,谢谢你开发了这么棒的软件包!
someFun <- function(d, .expr){
group <- substitute(.expr)
get(d)[,list(sum(y), sum(v)), by=group]
}
someFun("DT", x)
group V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
someFun("DT", "x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
someFun = function(d, col) {
get(d)[,list(sum(y),sum(v)),by=col]
}
someFun("DT","x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24
someFun("DT","x,y")
x y V1 V2
1: a 1 1 1
2: a 3 3 2
3: a 6 6 3
4: b 1 1 4
5: b 3 3 5
6: b 6 6 6
7: c 1 1 7
8: c 3 3 8
9: c 6 6 9
someFun <- function(d, cols){
setkeyv(get(d), cols)
cols <- substitute(cols)
get(d)[,list(sum(y), sum(v)), by=cols]
}
someFun("DT", "x")
x V1 V2
1: a 10 6
2: b 10 15
3: c 10 24