我有一个功能
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;
}
4条答案
按热度按时间plicqrtu1#
这里有一个可能的解决方案。这个解决方案要求函数参数不指定默认值(如下面的
z
)。用例示例
一些情景
Udapte:这是上面函数的更新,使其更通用。
它总是返回一个列表:
新功能
一些情景
u5i3ibmn2#
您可以
mget
函数环境。cx6n0qe33#
由reprex package(v1.0.0)于2021年2月23日创建
uxh89sit4#
不是解决方案,而是捕获“...”部分的想法。以引号或引号列表的形式返回为...传递的参数。
由reprex package(v1.0.0)于2021年2月23日创建