2016-11-14 38 views
1

寫入時功能的環境中,如果它被賦予一個data.table的名字下面的函數會工作可以這樣調用:當寫我自己的功能,我怎麼能「繼承」的data.table

library(data.table) 
irisDT <- data.table(iris) 
myDelta(irisDT) 

然而,這有幾個問題:

  1. 分配輸出到一個新的對象將工作,BU t原來被修改的地方,所以這可能是一個尷尬的副作用
  2. 我不假設(雖然我沒有測試過),這是使用所有數據中的最好的。桌面花式色牢度
  3. 這沒有使用'data.table方式',這將更多irisDT[, myDelta()],但是因爲它期望DT參數是data.table,所以我通過編寫irisDT[, myDelta(irisDT)]來重複自己。

明確,我想知道: 我缺少什麼寫功能,這使他們能夠從他們被稱爲中,而不必從提供的data.table對象data.table對象繼承函數參數

另外我很好奇: 在這種用例中,編寫一個可以從內部或外部調用data.table對象的函數是一種最佳實踐,其目標是計算對象中現有列的輸出列。你只寫一個或另一個?

雖然我可能會完全倒退,如果有的話請讓我知道。

+0

我不明白你究竟在問什麼。你的目標是什麼?讓你的功能正常工作,但不改變輸入? – Roland

+0

我的功能正如我期望的那樣工作,但是,我覺得我寫得很糟糕。我對data.table的理解是,你調用函數來修改'[i,j,by,等....]'的j參數內的表。例如我可以通過'IrisDT [,sum(Sepal.Width)''調用'Sepal.Width'列,但不在'sum()'中寫表名,但是,對於我以上的函數不起作用。 'irisDT [,myDelta()]'給出myDelta()中的錯誤:參數「DT」丟失,沒有默認值。我希望我的函數在data.table中使用時不必重新指定表名。 – DaveRGP

+1

請注意'sum'如何不分配列。你不能在引用data.table的時候在函數內部使用':='(或'set')。 – Roland

回答

1

[i, j, by, .SDcols]所選的data.table子集應用函數。例如:

myDelta2 <- function(x, baseline = 5) { 
    return(x - 5) 
} 

library(data.table) 
irisDT <- data.table(iris) 
irisDT[, lapply(.SD, myDelta2), .SDcols = c("Sepal.Length", "Sepal.Width")] 

當然,這可以簡單地也寫爲:

irisDT[, .SD - 5, .SDcols = c("Sepal.Length", "Sepal.Width")] 

或就地

irisDT[, c(paste0("delta", c("Sepal.Length", "Sepal.Width"))) := .SD - 5, .SDcols = c("Sepal.Length", "Sepal.Width")] 

建議你檢查出這個優秀的resource

PS:如果你想知道.SD然後閱讀this