R:如何使用命名参数来匹配和编辑命名对象列表的名称

R: How can I use named arguments to match & edit the names of a list of named objects

我想弄清楚如何创建一个函数来获取一组命名参数,参数值取自特定列表,并通过替换命名元素(在列表的元素名称中但函数参数的元素值)与函数参数的参数名称。 (这个名称向量首先取自数据框,但我认为这并不重要,也没有在下面包含它)。评估为多个名称的参数,或通过数字或逻辑向量表示范围的参数,以引用的形式单独保存以供以后处理。

这似乎是一个足够简单的问题,但我一直无法弄清楚如何去做。关键是它必须完全以编程方式完成。我的真实函数将具有不确定且可能有大量参数,如下所述。

为了说明我在说什么,这里有一个示例 "framework" 函数,缺少实际进行更改的胆量:

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 应该return,基于这些值。 (这是一个描述,而不是字面上的打印方式)

"No cows!"(打印为副作用)。

然后return:

list(xx = c("cat", "dog", "c", "d", "e", "yak", "eel", "h"), 
complex_assignments = list("zoo = 3:5"))

您看到命名参数的值用于匹配原始列表中的元素,而来自该参数的名称被转换为文本,然后替换标识的元素。这就是目标。

为了解释我的目的,我想为一个数据框维护两组独立的名称,一组用于它向世界展示的面孔,另一组仅供我为此对象编写的方法访问。

这个怎么样

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() 以生成所有值的列表。然后我们可以将其用作您感兴趣的转换的常规列表。