Аргументы в кавычках в rlang :: new_function (для фабрики функций) - PullRequest
0 голосов
/ 16 сентября 2018

Я хотел бы указать пользовательский аргумент для функции, созданной с помощью rlang::new_function.Для этого мне нужно передать аргумент args -аргументу new_function.

Я предполагаю, что named_arg следует заключать в кавычки / без кавычек.Это то, что я пробовал до сих пор:

library(rlang)

function_factory <- function(named_arg) {

  new_function(
    exprs(named_arg =,... = ),
    expr(print("hello world")),
    caller_env()
  )
}

fun1 <- function_factory(arg1)
fun1

#> function (named_arg, ...) 
#> print("hello world")

Желаемый результат будет:

#> function (arg1, ...) 
#> print("hello world")


Ниже приведен один из подходов, которые я пробовал, но не сработал:

function_factory <- function(named_arg) {
  named_arg_quo <- enquo(named_arg)

  new_function(
    exprs(!!named_arg_quo =,... = ),
    expr(print("hello world")),
    caller_env()
  )
}
#> Error: <text>:21:27: unexpected '='
#> 20:   new_function(
#> 21:     exprs(!!named_arg_quo =
#>                               ^

1 Ответ

0 голосов
/ 16 сентября 2018

Мы могли бы использовать substitute, чтобы получить аргумент без кавычек и изменить names из 'exprs`

function_factory <- function(named_arg) {

  nm1 <- deparse(substitute(named_arg))
  exp1 <- exprs(named_arg =,... = )
  names(exp1)[1] <- nm1
  new_function(
     exp1,
     expr(print("hello world")),
     caller_env()
   )

}

function_factory(arg1)
#function (arg1, ...) 
#print("hello world")

В случае, если мы используем rlang, затем преобразуем в строку с quo_name

library(rlang)
function_factory <- function(named_arg) {

  nm1 <- quo_name(enquo(named_arg))
  exp1 <- exprs(named_arg =,... = )
  names(exp1)[1] <- nm1
  new_function(
     exp1,
     expr(print("hello world")),
     caller_env()
   )

}

function_factory(arg1)
#function (arg1, ...) 
#print("hello world")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...