Вызов NSE: вырваться из разряда (заменить (...)) - PullRequest
0 голосов
/ 11 октября 2019

Давайте определим:

f <- function(x) deparse(substitute(x))

Задача: найти <something>, чтобы f(<something>) вернул "abc". Исключая, конечно, f(abc).

С "аккуратным NSE", то есть квазицитированием, это очень просто. Однако, согласно ссылкам NSE ( 1 , 2 , 3 ), это невозможно, поскольку substitute является чистым цитированием (в отличие от квазицитирования)функция.

Интересно, есть ли что-то неясное или недокументированное (не такое уж необычное!), которое позволяет заключать в кавычки в substitute, отсюда и вызов.

1 Ответ

1 голос
/ 11 октября 2019

@ Роланд прав. Поскольку x не оценивается, нет никакого выражения, которое вы можете предоставить f, которое не будет преобразовано в дословную строку. Квазиквотация в базе R обрабатывается bquote(), который имеет механизм .(), который работает аналогично !!:

# Quasiquotation with base R
f1 <- function(x) bquote( .(substitute(x)) + 5 )


# Quasiquotation with rlang
f2 <- function(x) rlang::expr( !!rlang::enexpr(x) + 5 )

e1 <- f1(y)               # y + 5
e2 <- f2(y)               # y + 5
identical(e1, e2)         # TRUE
eval(e1, list(y=10))      # 15
у Рланга
...