【问题标题】:How to update function signature after modification with rlang::fn_fmls?使用 rlang::fn_fmls 修改后如何更新函数签名?
【发布时间】:2020-04-07 22:27:06
【问题描述】:

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?

【问题讨论】:

  • @akrun 是的,我在我的问题中提到了这一点。有没有办法修改简单的f?
  • 检查attr(f, 'srcref')。

标签: r rlang


【解决方案1】:

问题似乎是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 创建

【讨论】:

  • 要么创建自定义print函数,要么修改源属性。
猜你喜欢
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 2021-10-01
  • 2021-10-07
相关资源
最近更新 更多