依赖于 R 中非标准评估的函数的包装器

Posted

技术标签:

【中文标题】依赖于 R 中非标准评估的函数的包装器【英文标题】:Wrapper for a function relying on non-standard evaluation in R 【发布时间】:2019-09-09 06:44:51 【问题描述】:

我围绕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 的子集参数与我的函数一起使用,也不能与最小的mytable &lt;- 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 &lt; 20, ] 作为解决方法在数据参数中进行子集化,但我希望提高我对 R 的了解。“Advanced R”帮助我了解错误是由于非标准评估引起的,但我没有设法更正我的代码。

所以我的问题是:

如何告诉 R 在 warpbreaks 中查找 breaks? 更一般地说,是否有更明显的基本 R 方法来计算单个变量和多个变量在垂直布局中具有频率和百分比的平面表? (我可以使用mytable(x = warpbreaks$tension, row.vars = 1) 获得单个变量的垂直布局。)

【问题讨论】:

问得很好,恭喜。如果我对问得不好的问题给出反馈,我觉得我应该用一个很好的可重复的例子来推荐这种结构良好的问题。 @PavoDive 谢谢! 【参考方案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'

这个错误让我找到了以前没有找到的资源。

Somethreads 引导我:

# 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 可能会更慢。

更重要的是,这些方法导致了我的另一个问题:I can not use my wrapper with lapply and with anymore.

【讨论】:

以上是关于依赖于 R 中非标准评估的函数的包装器的主要内容,如果未能解决你的问题,请参考以下文章

如何将变量传递给已经在 R 的参数中实现非标准评估的函数?

R中的标准评估和非标准评估

R语言构建logistic回归模型并评估模型:构建基于混淆矩阵计算分类评估指标的自定义函数阳性样本比例(垃圾邮件比例)变化对应的分类器性能的变化基于数据阳性样本比例选择合适的分类评估指标

机器学习实战基础(十八):sklearn中的数据预处理和特征工程特征选择 之 Wrapper包装法

Android JobIntentService 作为另一个服务的包装器

R语言使用R基础安装中的glm函数构建乳腺癌二分类预测逻辑回归模型分类预测器(分类变量)被自动替换为一组虚拟编码变量summary函数查看检查模型使用table函数计算混淆矩阵评估分类模型性能