我试图弄清楚如何创建一个函数来获取一组命名参数,从特定列表中获取参数值,并通过替换命名的元素来修改列表(在列表的元素名称中但是元素函数参数的值与函数参数的参数名称。 (这个名称的向量首先取自数据框,但我认为这并不重要,并且未在下面包含它)。评估为多个名称或通过数字或逻辑向量表示范围的参数将以引用形式单独保存,以便以后处理。
这似乎是一个直截了当的问题,但我无法弄清楚如何做到这一点。关键是它必须完全以编程方式完成。我的真实函数将具有不确定且可能大量的参数,如下所述。
为了说明我在说什么,这里有一个示例“框架”函数,缺少实际会进行更改的内容:
ChangeIt <- function(dog = NULL, cat = NULL, cow = NULL, ...){
xx <- c("a", "b", "c", "d", "e", "f", "g", "h")
# missing stuff here
if (is.NULL(cow)) print("No cows!")
list(xx, complex_assignments = list())
}
以下是上述函数的命名参数的一组可能值。
ChangeIt(dog = "b", cat = "a", yak = "f", eel = "g", zoo = 3:5)
这就是ChangeIt应该根据这些值返回的内容。 (这是一个描述,而不是字面打印的方式)
"No cows!"
(印刷为副作用)。
然后返回:
list(xx = c("cat", "dog", "c", "d", "e", "yak", "eel", "h"),
complex_assignments = list("zoo = 3:5"))
您会看到命名参数的值用于匹配原始列表中的元素,而该参数中的名称将转换为文本,然后替换已标识的元素。这就是目标。
为了解释我的目的,想要为数据框维护两组不同的名称,一组用于表示世界的面,另一组只能用于我为此对象编写的方法。
答案 0 :(得分:1)
这个怎么样
ChangeIt <- function(dog = NULL, cat = NULL, cow = NULL, ...){
cc <- match.call()
cc[[1]] <- quote(list)
allargs <- eval(cc)
xx <- c("a", "b", "c", "d", "e", "f", "g", "h")
toreplace <- sapply(allargs, function(x) {length(x)==1 && x %in% xx})
xx <- replace(xx, match(unlist(allargs[toreplace]), xx), names(allargs[toreplace]))
if (is.null(cow)) print("No cows!")
list(xx=xx, complex_assignments = allargs[!toreplace])
}
ChangeIt(dog = "b", cat = "a", yak = "f", eel = "g", zoo = 3:5)
在这里,我们使用match.call()
来获取所有函数调用并将其传递给list()
以生成所有值的列表。然后我们可以像常规列表一样使用它来进行您感兴趣的转换。