Я не уверен, что здесь об этом спрашивали, но я здесь очень запутался. Я читаю эту замечательную книгу под названием Advanced R от Хэдли Уикхема, которую здесь.
Здесь была описана функция под названием cement
, я немного изменил ее и пытаюсь понять.
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
с дополнительным параметром, класс возвращает «список», {простое добавление class (expr (x)) возвращает «name», тогда как class (exprs (x)) возвращает «list»}.
Я не понимаю, почему он печатает другой класс, возвращаемый 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
не может работать, если нет, то как правильно?
Прошу прощения за слишком длинные предложения. Мой родной язык не английский, поэтому, если есть что-то глупое, пожалуйста, дайте мне знать, я исправлю это. Надеюсь, это не дубликат, я пытался найти ответ, но сам не нашел.
Спасибо за любую помощь.
Версия R: 3.4.2 rlang: 0.2.0