我想访问用户选择的函数输入以及函数的所有默认参数。
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
到输出中,但这只会返回用户最初输入的信息:< / p>
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
为我提供了默认值,但没有用户输入。
我想将所有这些保存在输出对象(在此情况下为列表)中,以便将其保存以用于对象的进一步处理。
任何建议如何实现?
非常感谢!
答案 0 :(得分: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
答案 1 :(得分:0)
这已经在另一个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
现在是默认参数,也是用户输入的arugment。
感谢@ user63230的帮助!