2012-08-08 60 views
3

我有一個問題,包括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

回答

3

在這裏你去:

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