gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:29:57 30 4
gpt4 key购买 nike

我在 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 <- 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, ] 在数据参数中设置子集作为一种解决方法,但我希望提高我的 R 知识。“ Advanced R”帮助我理解错误是由于非标准评估造成的,但我没有设法更正我的代码。

所以我的问题是:
  • 我如何告诉 R 寻找 breakswarpbreaks ?
  • 更一般地说,是否有更明显的基本 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'

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

    Some threads引导我:
    # 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 中非标准评估的函数的包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55754330/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com