用rlang :: fn_fmls修改后如何更新函数签名?

时间:2020-04-07 22:27:06

标签: r rlang

rlang::fn_fmls<-允许我们修改函数签名:

f <- function(a, b, c) print(paste(a, c))
f_args <- rlang::fn_fmls(f)
f_args["b"] <- NULL
rlang::fn_fmls(f) <- f_args
f(1, 2)
#> [1] "1 2"

reprex package(v0.3.0)于2020-04-07创建

很显然,我们已经从函数的签名中删除了b。但是,如果我们打印函数本身:

f
#> function(a, b, c) print(paste(a, c))

b仍会出现在其签名中。实际上,使用args(f)(仅打印签名)可以使用b

我应该怎么做才能使函数(带有主体)正确打印而省略b

1 个答案:

答案 0 :(得分:2)

问题似乎是print.function()具有useSource = TRUE,这迫使使用原始函数签名和正文。

我找到的解决方案是修改函数的类并创建自定义打印函数。

f <- function(a, b, c) {
  b <- 1
  print(paste(a, c))
}
f_args <- rlang::fn_fmls(f)
f_args["b"] <- NULL
rlang::fn_fmls(f) <- f_args
class(f) <- c("myfunction", "function")

print.myfunction <- function(f) {
  class(f) <- NULL
  print(f, useSource = FALSE)
}

f
#> function (a, c) 
#> {
#>     b <- 1
#>     print(paste(a, c))
#> }

reprex package(v0.3.0)于2020-04-07创建