R中依赖非标准求值的函数的包装器

R中依赖非标准求值的函数的包装器,r,function,subset,evaluation,ellipsis,R,Function,Subset,Evaluation,Ellipsis,我围绕ftable编写了一个包装器,因为我需要为许多变量计算带有频率和百分比的平面表: mytable <- function(...) { tab <- ftable(..., exclude = NULL) prop <- prop.table(x = tab, margin = 2) * 100 bind <- cbind(as.matrix(x = tab),

我围绕
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
我知道我可以在数据参数中使用
data=warpbreaks[warpbreaks$breaks<20,]
作为解决方法,但我希望提高我对R的了解。“帮助我理解错误是由于非标准评估造成的,但我没有纠正我的代码

因此,我的问题是:

  • 如何让R在
    warpbreaks
    中查找
    breaks
  • 更一般地说,对于单变量和多变量,在垂直布局中是否有一种更明显的base R方法来计算具有频率和百分比的平面表?(我可以使用
    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'
然而,我正在寻找这两种方法(函数1和函数2)的优缺点,因为我不知道一种方法是否受欢迎。到目前为止,我刚刚发现,
do.call
可能会慢一些


更重要的是,这些方法导致了我的另一个问题:

问得很好,恭喜。如果我给出的反馈不是问得不好的问题,我觉得我应该推荐这种结构良好的问题,并提供一个很好的可复制的例子。@PavoDive谢谢!
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
}
# function 2
mytable <- function(...) {
    mc <- match.call()
    mc[[1]] <- quote(expr = ftable)
    mc["exclude"] <- list(NULL)
    eval(expr = mc)
    # etc
}