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> 

感谢您的帮助。

+1

可能重复(http://stackoverflow.com/questions/9705488/using-data-table- i-and-j-arguments-in-function) – Andrie 2012-08-08 07:09:34

+0

感谢您将我引荐给您的主题Andrie。但是,如果我使用substitute(),它仍然不能工作。 – majom 2012-08-08 08:00:00

+0

请在链接问题的答案中加入建议来编辑您的问题 - 否则可能会导致它作为副本关闭。 – Andrie 2012-08-08 08:00:20

在这里你去:

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 
+0

谢谢安德烈和马修。你的回答帮了我很多。但是,在我的最终功能中,我还需要使用'setkey()'命令。当另一部分工作时,setkey(get(d),.expr)'行仍然不起作用。实际上,这就是我混淆的原因(我从来没有看过聚合,因为我首先得到了setkey()的错误)。 – majom 2012-08-08 09:35:59

+0

@majom尝试使用'?setkeyv'(额外的v结束)。 – 2012-08-08 09:51:55

+1

@majom用'setkeyv'编辑的答案 – Andrie 2012-08-08 10:27:29