[英]Wrapper for a function relying on non-standard evaluation in R
我寫了一個圍繞ftable
的包裝器,因為我需要為許多變量計算頻率和百分比的平面表:
mytable <- function(...) {
tab <- ftable(...,
exclude = NULL)
prop <- prop.table(x = tab,
margin = 2) * 100
bind <- cbind(as.matrix(x = tab),
as.matrix(x = prop))
margin <- addmargins(A = bind,
margin = 1)
round(x = margin,
digits = 1)
}
mytable(formula = wool + tension ~ breaks,
data = warpbreaks)
A_L A_M A_H B_L B_M B_H A_L A_M A_H B_L B_M B_H
10 0 0 1 0 0 0 0.0 0.0 11.1 0.0 0.0 0.0
12 0 1 0 0 0 0 0.0 11.1 0.0 0.0 0.0 0.0
13 0 0 0 0 0 1 0.0 0.0 0.0 0.0 0.0 11.1
14 0 0 0 1 0 0 0.0 0.0 0.0 11.1 0.0 0.0
15 0 0 1 0 0 2 0.0 0.0 11.1 0.0 0.0 22.2
...
Sum 9 9 9 9 9 9 100.0 100.0 100.0 100.0 100.0 100.0
但是,我不能使用ftable
的子參數和我的函數,也不能使用minimal mytable <- function(...) ftable(...)
:
mytable(formula = wool + tension ~ breaks,
data = warpbreaks,
subset = breaks < 20)
Error in eval(substitute(subset), data, env) :
..3 used in an incorrect context, no ... to look in
我知道我可以使用data = warpbreaks[warpbreaks$breaks < 20, ]
作為解決方法在data參數中進行子集化,但我希望提高我對R的了解。“ Advanced R ”幫助我理解錯誤是由於非標准的評估,但我沒有設法糾正我的代碼。
所以我的問題是:
warpbreaks
尋找breaks
? mytable(x = warpbreaks$tension, row.vars = 1)
獲得單個變量的垂直布局mytable(x = warpbreaks$tension, row.vars = 1)
。) 使用沒有...
的函數定義,我得到一個不同的錯誤:
mytable <- function(formula,
data,
subset) ftable(formula = formula,
data = data,
subset = subset)
mytable(formula = wool + tension ~ breaks,
data = warpbreaks,
subset = breaks < 20)
Error in xj[i] : invalid subscript type 'closure'
這個錯誤導致我以前找不到的資源。
# function 1
mytable <- function(...) {
mc <- match.call()
mc["exclude"] <- list(NULL)
do.call(what = ftable,
args = as.list(x = mc[-1]))
#etc
}
write.csv
系列和lm
源代碼使我:
# function 2
mytable <- function(...) {
mc <- match.call()
mc[[1]] <- quote(expr = ftable)
mc["exclude"] <- list(NULL)
eval(expr = mc)
# etc
}
但是,我正在尋找兩種方法(功能1和功能2)的優點和缺點,因為我不知道某種方法是否受到青睞。 到目前為止,我剛發現do.call
可能會變慢。
更重要的是,這些方法導致我到另一個問題: 我不能用我的包裝與lapply
並with
了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.