簡體   English   中英

一個簡單的可重現示例,在 ZE1E1D3D405731837E 中的自定義 function 中將 arguments 傳遞給 data.table

[英]A simple reproducible example to pass arguments to data.table in a self-defined function in R

我已經在谷歌上搜索了這個答案幾個小時。 很多人都問過類似的問題,但我沒有找到一個足夠簡單的問題或一個直截了當的答案。 這是我的方法:

假設我想在data.table中做一個簡單的分組:

library(data.table)
mtcars = data.table(mtcars)
mtcars[,sum(mpg), gear]

# Here are the results
#   gear    V1
#1:    4 294.4
#2:    3 241.6
#3:    5 106.9

但是,如果我使用自定義的 function 來執行此操作:

zz = function(data, var, group){
  return(data[,sum(var), group])
}
zz(mtcars, mpg, gear)

我收到一條錯誤消息:

eval 中的錯誤(bysub、parent.frame()、parent.frame()):未找到 object 'gear'

我嘗試了substituteevalquote和其他解決方案,但它們都不起作用。 我想知道是否有人可以對此給出更直接的解決方案和解釋。

謝謝你,萬聖節快樂!

如果我們使用未引用的eval ,請substitute並評估

zz <- function(data, var, group){
 var <- substitute(var)
 group <- substitute(group)
 setnames(data[, sum(eval(var)), by = group],
        c(deparse(group), deparse(var)))[]
 # or use
 #  setnames(data[, sum(eval(var)), by = c(deparse(group))], 2, deparse(var))[]

}
zz(mtcars, mpg, gear)
#   gear   mpg
#1:    4 294.4
#2:    3 241.6
#3:    5 106.9

雖然不完美,但...論點可能會有所幫助:

zz = function(dt, ...){
  return(dt[...])
}

zz(mtcars, , sum(mpg), gear)

   gear    V1
1:    4 294.4
2:    3 241.6
3:    5 106.9

我真的不明白寫一個 function 沒有引用 arguments 的意義。 為什么不直接使用 data.table 語法呢?

如果您想編寫 function ,則采用列名的字符向量更有意義,因為這比符號更具可編程性(考慮使用setkeysetkeyv編程或編寫函數以使用aesaes_string )缺點是function 的內部很亂,需要 eval(parse(text=.))) NSE 才能使 GForce 正常工作,但 function 接口更具可擴展性。

zz = function(data, var, group){
  eval(parse(text=paste0("data[,sum(",var,"),by=",group,"]")))
}
zz(mtcars, "mpg", "gear")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM