注表情:我打了這個問題的確切問題並不適用於最新版本的數據表。如果您想按照標題中的描述進行操作,請查看包裝常見問題解答1.6 OK, but I don’t know the expressions in advance. How do I programatically pass them in?中的相應問題。data.table`:=`分配與動態輸入(現有列)和輸出(新列名)
我看到an answer闡釋如何構建表達在
DT[,j=eval(expr)]
我用這與工作分配進行評價,```:=`(mycol = my_calculation)``,我想知道...
- 如何動態地指定名稱「mycol」?
- 讓「my_calculation」採用動態確定的一組列的正確方法是什麼?
「動態」,我的意思是「在我爲我的expr
編寫代碼後確定」。
新的例子
編輯:爲了更好地說明問題,這裏是另一個例子。查看編輯歷史記錄以查看原件。
require(data.table)
require(plyr)
options(datatable.verbose=TRUE)
DT <- CJ(a=0:1,b=0:1,y=2)
# setup:
expr <- as.quoted(paste(expression(get(col_in_one)+get(col_in_two))))[[1]]
# usage:
col_in_one <- 'a'
col_in_two <- 'b'
col_out <- 'bah'
DT[,(col_out):=eval(expr)] # fails, should take the form j=eval(expr)
我想保持安裝和使用階段分開,所以我的代碼更易於維護。我的真實表情比這個例子更混亂(它只是選擇一列)。
問題
第一個問題:我怎樣才能使分配到列, 「col_out」,動態?我的意思是:我想在動態指定「cols_in_ *」和「col_out」。
我試圖創造「expr的」各種表情,但as.quoted
拋出關於不把某些東西給=
符號左側的錯誤。
第二個問題:我怎樣才能避免對使用
get
的警告?
警告建議使用.SDcols
,讓[.data.table
知道我正在使用哪些列。但是,如果我使用.SDcols
參數,另一個警告說除非使用.SD
,否則沒有意義。
暫定解決方案
我到目前爲止的解決方案是......
# Ricardo + eddi:
expr2 <- as.quoted(paste(expression(`:=`(
Vtmp=.SD[[col_in_one]]+.SD[[col_in_two]]))))[[1]]
# usage
col_in_one <- 'a'
col_in_two <- 'b'
col_out <- 'bah'
DT[,eval(expr2),.SDcols=c(col_in_one,col_in_two)]
setnames(DT,'Vtmp',col_out)
這還牽扯到做兩步操作和跟蹤「Vtmp」的小煩惱,所以第一個問題還是部分打開。
相關:HTTP:/ /stackoverflow.com/questions/15790743/data-table-meta-programming/15791747#15791747 –