【问题标题】:R function - access all arguments including default argumentsR 函数 - 访问所有参数,包括默认参数
【发布时间】:2020-06-10 16:07:37
【问题描述】:

我想访问用户选择的函数输入以及函数的所有默认参数。

example <- function(a = 1:10, b) {
  c = a + b

  output <- list()
  output$call <- sys.call()
  output$data <- c
  return(output)
}

example_output <- example(b=10)

我正在尝试使用sys.call() 获取相关信息,然后将其作为call 存储在输出中,但这只会返回用户首先输入的信息:

example_output
$call
example(b = 10)

$data
 [1] 11 12 13 14 15 16 17 18 19 20

这仍然让我不确定在这种情况下a 是什么,因为它是在函数定义中默认设置的。

我知道我可以使用获取默认参数

formals(example)
$a
1:10

$b

这给了我默认值,但不是用户输入。

我想将所有这些都保存在输出对象(本例中为列表)中,以便保存以供进一步处理该对象。

有什么建议吗?

非常感谢!

【问题讨论】:

标签: r function


【解决方案1】:

我真的想不出一个应用程序,但这肯定是可能的:

example <- function(a = 1:10, b) 
{
  default_args <- formals(example)
  mc           <- as.list(match.call())
  passed_vars  <- mc[-1]
  default_args <- default_args[is.na(match(names(default_args), names(passed_vars)))]
  for(i in seq_along(default_args)) 
    passed_vars[[names(default_args)[i]]] <- default_args[[i]]

  passed_vars <- passed_vars[match(names(formals(example)), names(passed_vars))]

  mc <- mc[1]

  for(i in seq_along(passed_vars)) 
    mc[[names(passed_vars)[i]]] <- passed_vars[[names(passed_vars)[i]]]

  c = a + b

  output <- list()
  output$call <- as.call(mc)
  output$data <- c
  return(output)
}

所以我们可以这样做:

example(b=5)
#> $call
#> example(a = 1:10, b = 5)
#>
#> $data
#> [1]  6  7  8  9 10 11 12 13 14 15

和

example(a = 1:5, b=5)
#> $call
#> example(a = 1:5, b = 5)
#>
#> $data
#> [1]  6  7  8  9 10

【讨论】:

    【解决方案2】:

    这已经在另一个post 中得到了回答(我应该真的找到了..)。

    这可以使用mget(names(formals()),sys.frame(sys.nframe())) 来完成。 在一个完整的例子中使用它:

    example <- function(a = 1:10, b) {
      c = a + b
      
      output <- list()
      output$call <- mget(names(formals()),sys.frame(sys.nframe()))
      output$data <- c
      return(output)
    }
    
    example(b=10)
    

    给我:

    $call
    $call$a
     [1]  1  2  3  4  5  6  7  8  9 10
    
    $call$b
    [1] 10
    
    
    $data
     [1] 11 12 13 14 15 16 17 18 19 2
    

    现在是默认参数以及用户输入的参数。

    感谢@user63230 的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-05-19
      • 2020-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多