r - 如何访问函数参数的默认值?

标签 r function arguments evaluation

问题:

我想使用函数 default_arg() 在函数 func 的上下文中访问 arg 的默认值。但是,我也希望这个函数足够聪明,能够在某些情况下猜出我想要哪个函数和哪个参数:

案例 1 - 与显式参数一起使用:

tester_1 <- function(x = 1, y = 2, z = 3) {
  x * y + z
}
default_arg(x, tester_1) # this would evaluate to 1

案例 2 - 在函数体内使用

tester_2 <- function(x = 1, y = 2, z = 3) {
  
  x_default <- default_arg(x) # this would evaluate to 1
  
  if(x < x_default) {
    stop(paste("x should be greater or equal to default value:", x_default))
  }

  x * y + z
}

案例 3 - 用作参数:

tester_1(
  x = 2,
  y = 1,
  z = default_arg() # This would evaluate to 3
)

当前方法:

我能够创建适用于情况 1 和情况 2 的东西,但我不确定如何处理情况 3。这是我目前使用的方法,使用 rlang 中的一些函数>:

default_arg <- function(arg, func = sys.function(sys.parent())) {
  formals(func)[[as_name(enquo(arg))]]
}

最佳答案

在我提出的解决方案中,我还消除了 rlang 依赖项(请参见下文):

default_arg <- function(arg = NULL, func = NULL) {
  if(deparse(substitute(arg)) == "NULL" & is.null(func))
  {
    arg = sys.calls()[[1]]
    val = as.character(arg); names(val) = names(arg)
    func = val[1]
    variable = names(which(val == "default_arg()"))
    return(formals(func)[[variable]])
  }
  if(is.null(func))
  {
    func = as.character(sys.call(sys.parent()))[1]
  }
  
  return(formals(func)[[deparse(substitute(arg))]])
}

default_arg(x, tester_1) # 1
default_arg(y, tester_1) # 2
default_arg(z, tester_1) # 3
tester_2() # 5
tester_1(x = 1, y = 2, z = default_arg()) # 5
tester_1(x = 1, y = default_arg(), z = 3) # 5
tester_1(x = default_arg(), y = 2, z = 3) # 5

基本上,它只是解析调用并提取相关信息。 虽然这行得通,但我相信您仍然可以通过避免条件来使它更整洁。祝你好运!

最好的, 脑室。

关于r - 如何访问函数参数的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63150445/

相关文章:

json - 如何将复杂的 JSON 数据转换为单个数据帧?

r - 在 r 中格式化绘图轴

python - 使用相同的字典作为各种函数的参数,有些函数的参数较少

c - 为什么返回带结构的函数会出现计算错误

constructor - Structuremap 3.0 EqualToAppSetting

R:内存不足,如何遍历行?

css - 去除shinydashboardPlus中右边栏宽度改变时出现的多余空间

function - ffmpeg avcodec_get_frame_defaults 被宣布弃用

mysql:更改功能但保持旧功能

excel - 为什么 "bCheck"总是返回 "True"?