Шаблоны для выражения выражения в R
Многие пакеты R допускают функции, которые принимают выражения в качестве аргументов. Некоторые, однако, идут на шаг дальше. Например, plyr
Пакет от @hadley смело определяет функцию с именем .
:
> .
function (..., .env = parent.frame())
{
structure(as.list(match.call()[-1]), env = .env, class = "quoted")
}
<environment: namespace:plyr>
В моем окружении ?'.'
выдает "Помощь не найдена для темы в любом пакете." На первый взгляд это выглядит .()
предоставляет механизм для отложенной оценки, который автоматически фиксирует окружающую среду:
> x <- c(1,2,3)
> dot <- .(x + 10)
> dot
List of 1
$ x + 10: language x + 10
- attr(*, "env")=<environment: R_GlobalEnv>
- attr(*, "class")= chr "quoted"
> dot[[1]]
x + 10
> eval(dot[[1]])
[1] 11 12 13
Это все, что происходит? Я понимаю цель env
атрибут, но почему class = "quoted"
важный?
При всех различных механизмах R должен определять выражения, а также оценку задержек и сил, каковы некоторые преимущества и издержки использования схемы .()
при передаче выражений?
1 ответ
От ?'.'
подробности
Подобные трюки могут быть выполнены с заменой, но когда функции могут вызываться несколькими способами, становится все сложнее обеспечить извлечение значений из правильного фрейма. Трюки с заменой также затрудняют программирование для функций, которые их используют, в то время как цитируемый класс предоставляет as.quoted.character для преобразования строк в соответствующую структуру данных.