我有一个函数
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://dev59.com/Yb_qa4cB1Zd3GeqPLZt8
# 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;
}
names(list(...))
和names(match.call()[-1])
。它们可以在函数grabFunctionParameters
中被引用吗?也许需要包含一个enviro
?获取名称是解决问题的一半。 - mshaffergrabFunctionParameters
吗?目标是创建一个可变参数的解决方案,我只是提供了一个单一的例子,其中包含adebo.deepSearch = function(z, pi_0 = 0.3, families=list(), ... )
。 - mshafferas.list(match.call()[-1])
- Rolandas.list(match.call()[-1])
不包括默认参数?它提供变量,但不提供值:> adebo.deepSearch(z) $z z
并且我可以有一个外部函数grabFunctionParameters
(可变解决方案)吗? - mshaffer