取消引用 rlang::new_function 中的参数(对于函数工厂)

Unquote arguments in rlang::new_function (for function factory)

我想为通过 rlang::new_function 创建的函数指定自定义参数。为此,我需要将参数传递给 new_functionargs 参数。

我假设 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 =
#>                               ^

我们可以使用 substitute 获取未引用的参数并更改 'exprs`

names
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")