Я не уверен, если это было задано здесь, но я очень смущен здесь.Я читаю эту удивительную книгу Хадли Уикхэма "Advanced R" от здесь .
Здесь описана функция под названием cement
, я немного ее изменил и пытаюсь понятьit.
library(rlang)
cement1 <- function(x) {
dots <- expr(x)
print(class(dots))
#paste(expr_name(x))
}
cement2 <- function(y,z) {
dots <- exprs(y,z)
print(class(dots))
#paste(purrr::map(dots, expr_name), collapse = " ")
}
Выполнение вышеуказанного cement1
без каких-либо параметров возвращает мне класс точек как «имя».
Однако, когда я запускаю функцию cement2
с дополнительным параметром, класс возвращает «список», {просто помещая класс (expr (x)), возвращает «имя», тогда как класс (exprs (x)) возвращает «список»}.
Я не понимаю, почему печатается другой класс, возвращаемый expr
и exprs
.Единственное различие, о котором я думал, что знал о них, было то, что один имеет дело с одним параметром, другой имеет дело с несколькими параметрами, но я могу ошибаться, я мог пропустить некоторые детали.
Исходная проблема : Итак, все началось с запуска этих двух функций по отдельности, удалив раздел комментариев в коде для cement1
и cement2
, когда я запускаю функции ниже.возвращаются ли они выводом:
cement1(Hello) #Returns , Error in type_of(.x) : object 'Hello' not found
cement2(Hello) #Works very well and returns, [1] "y z"
Поэтому я попытался найти причину сбоя cement1
, а затем напечатал их классы, и именно тогда я понял, что expr
и exprs
возвращают разные классы.
Мой вопрос :
1) Они задуманы, если да, то почему?Или я совершаю ужасную ошибку, которую сейчас не вижу.
2) Неужели cement1
не может сработать, если нет, как это правильно?
Iпрошу прощения за слишком длинные предложения, мой родной язык не английский, поэтому, если есть что-то глупое, пожалуйста, дайте мне знать, я исправлю это.Я надеюсь, что это не дубликат, я попытался найти ответ, но не смог найти его самостоятельно.
Спасибо за любую помощь.
R Версия : 3.4.2 rlang : 0,2,0