簡體   English   中英

包含函數的包裝器依賴於R中的非標准評估

[英]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 ”幫助我理解錯誤是由於非標准的評估,但我沒有設法糾正我的代碼。

所以我的問題是:

  • 我如何告訴R在warpbreaks尋找breaks
  • 更一般地說,單個和多個變量的垂直布局中是否有更明顯的基本R方式來計算具有頻率和百分比的平面表? (我可以使用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可能會變慢。

更重要的是,這些方法導致我到另一個問題: 我不能用我的包裝與lapplywith了。

暫無
暫無

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

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