Data.table和get()命令(R)
问题描述:
我有一个问题,包括data.table
在一个函数中的操作。输入参数是data.table名称和列/变量名称。Data.table和get()命令(R)
我可以通过使用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)
替代方案:quote()
- >这工作。不过,我对可在函数内部工作的解决方案感兴趣。
DT <- data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
d <- "DT"
variable <- quote(x)
d.agg <- get(d)[,list(sum(y), sum(v)), by=variable]
尽管,后者替代工作variable <- quote(x)
产生错误消息:
<simpleError in doTryCatch(return(expr), name, parentenv, handler): object 'x' not found>
<simpleError in is.scalar(val): object 'x' not found>
<simpleError in is.data.frame(obj): object 'x' not found>
感谢您的帮助。
答
在这里你去:
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
编辑从马修:
+1以上。和/或字符列名接受by
直接,太:
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("DT",x)
将无法正常工作。所以阿德里的答案更一般。
EDIT与[在功能使用data.table i和j参数]的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
可能重复(http://stackoverflow.com/questions/9705488/using-data-table- i-and-j-arguments-in-function) – Andrie 2012-08-08 07:09:34
感谢您将我引荐给您的主题Andrie。但是,如果我使用substitute(),它仍然不能工作。 – majom 2012-08-08 08:00:00
请在链接问题的答案中加入建议来编辑您的问题 - 否则可能会导致它作为副本关闭。 – Andrie 2012-08-08 08:00:20