Расширение многоточия во вложенных функциях: ошибка «..3 используется в неверном контексте, нет ... искать - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть следующий фрагмент кода:

require(lattice)
f.barchart <- function(...) {
    barchart(...,
        panel = function(x, y, ...) {
            panel.barchart(x, y, ...)
        }
    )
}

x <- data.frame(a = c(1,1,2,2), b = c(1,2,3,4), c = c(1,2,2,1))
f.barchart(a ~ b, data = x, groups = c)

В результате выдается следующая ошибка:

..3 used in an incorrect context, no ... to look in

Когда я использую следующее определение:

f.barchart <- function(...) {
    substitute(barchart(...,
        panel = function(x, y, ...) {
            panel.barchart(x, y, ...)
        }
    ))
}

Я получаю:

barchart(a ~ b, data = x, groups = c,
    panel = function(x, y, ...) {
        panel.barchart(x, y, a ~ b, data = x, groups = c)
    })

Я не уверен, является ли это причиной вышеуказанной ошибки, но это будет означать, что многоточие в panel.barchart ошибочно расширяется с помощью содержимое аргументов, переданных f.barchart, а не панели функция.

Есть ли способ избежать этой проблемы? Как я могу сделать функцию Работа?

1 Ответ

7 голосов
/ 19 февраля 2010

Насколько я понимаю, это происходит не из-за вложенности ..., а из-за первого ... в гистограмме. Так что даже это не работает:

f.barchart <- function(...) {
    barchart(...)
}

x <- data.frame(a = c(1,1,2,2), b = c(1,2,3,4), d = c(1,2,2,1))
print(f.barchart(a ~ b, data = x, groups = d))

Я думаю, что это потому, что ... это паирлист, в то время как Barchart ожидает индивидуальных аргументов. Нам нужно распаковать pairlist, убедившись, что мы не оцениваем его слишком рано. Вот мое решение:

f.barchart <- function(...) {
  cl<-match.call()
  cl$panel=function(x, y, ...) {
            panel.barchart(x, y, ...)
          }
  cl[[1]]=barchart
  eval(cl)
}

Мы фиксируем вызов f.barchart с помощью match.call, который расширяет точки, добавляет аргумент панели к вызову, задает вызываемую функцию как barchart, а затем оценивает вызов. Так же, как мы добавили аргумент панели, мы могли удалить аргументы, которые используются f.barchart, но которые не нужно передавать в barchart.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...