【发布时间】:2021-02-23 08:47:55
【问题描述】:
我有一个函数
adebo.deepSearch = function(z, pi_0 = 0.3, families=list(), ... )
{
}
我想捕获通过名为grabFunctionParameters 的函数传入的所有参数名称和值;例如,
adebo.deepSearch = function(z, pi_0 = 0.3, families=list(), ... )
{
args = grabFunctionParameters();
}
其中 args 是一个包含“键”和“值”的列表,例如
args[["pi_0"] = 0.3;
适用于所有键和值,包括省略号 (...) 中的键和值。
理想的(可变参数)解决方案是外部函数grabFunctionParameters()
解决办法:
这是提供的接受的答案:# https://stackoverflow.com/questions/66329835/
# nice work :: B. Christian Kamgang
# .GlobalEnv$.function.args.memory ... key memory on last function call ... so I could reference outside the function
grabFunctionParameters <- function() {
pf <- parent.frame()
args_names <- ls(envir = pf, all.names = TRUE, sorted = FALSE)
if("..." %in% args_names) {
dots <- eval(quote(list(...)), envir = pf)
} else {
dots = list()
}
args_names <- sapply(setdiff(args_names, "..."), as.name)
if(length(args_names)) {
not_dots <- lapply(args_names, eval, envir = pf)
} else {
not_dots <- list()
}
idx <- names(dots) != "";
list(.keys. = names(not_dots), .vals. = unname(not_dots), .fn. = as.character(sys.call(1L)[[1L]]), .scope. = pf, .dot.keys. = names(dots[idx]), .dot.vals. = unname(dots[idx]));
}
这是提供的接受的答案(格式有点不同):
grabFunctionParameters <- function()
{
pf = parent.frame();
my.names = ls(envir = pf, all.names = TRUE, sorted = FALSE);
dots = if("..." %in% my.names) { eval(quote(list(...)), envir = pf); } else { list(); }
dots.idx = ( names(dots) != "" );
remaining = sapply( setdiff(my.names, "..."), as.name);
not.dots = if(length(remaining) > 0) { lapply( remaining, eval, envir = pf); } else { list(); }
res = list();
res$.fn. = as.character( sys.call(1L)[[1L]] );
res$.scope. = pf;
res$.keys. = names( not.dots );
res$.vals. = not.dots; # unname(not_dots); # I want keys on "vals"
res$.dots.keys. = names( dots[dots.idx] );
res$.dots.vals. = dots[dots.idx]; # unname(dots[dots.idx]);
res;
}
【问题讨论】:
-
stackoverflow.com/questions/13687630/… 引用
names(list(...))和names(match.call()[-1])。可以在函数grabFunctionParameters中引用它们吗?也许需要包含enviro?获得名字是成功的一半。 -
根据函数体的其余部分,您可以重写该函数以将命名列表作为参数。
-
哪个函数?
grabFunctionParameters?目标是创建一个可变参数解决方案,我只是提供一个带有adebo.deepSearch = function(z, pi_0 = 0.3, families=list(), ... )的示例 -
as.list(match.call()[-1]) -
as.list(match.call()[-1])如果不传就不包含默认参数?提供变量,但不提供值:> adebo.deepSearch(z) $z z我可以有一个外部函数grabFunctionParameters(可变参数解决方案)吗?
标签: r function getter-setter variadic