Оболочка для функции, основанной на нестандартной оценке в R - PullRequest
3 голосов
/ 19 апреля 2019

Я написал оболочку около 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 искать breaks в warpbreaks?
  • В целом, существует ли более очевидный базовый способ R для вычисления плоских таблиц с частотой и процентом в вертикальной компоновке для обоиха несколько переменных?(Я могу получить вертикальное расположение для одной переменной с помощью mytable(x = warpbreaks$tension, row.vars = 1).)

1 Ответ

0 голосов
/ 20 апреля 2019

С определением функции без ... я получаю другую ошибку:

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.

...