[英]R: How can I use named arguments to match & edit the names of a list of named objects
我試圖弄清楚如何創建一個函數來獲取一組命名參數,並從特定列表中獲取參數值,並通過替換命名的元素(在列表的元素名稱中但在元素的元素值中)來修改列表函數參數)以及函數參數的參數名稱。 (此名稱向量首先從數據幀中獲取,盡管我認為這並不重要,並且未在下面包含它)。 評估多個名稱或通過數字或邏輯向量表示范圍的參數將以引號形式單獨保存,以備后用。
這似乎是一個非常簡單的問題,但是我還無法弄清楚該怎么做。 至關重要的是,它必須完全以編程方式完成。 我的實函數將具有不確定的且潛在的大量參數,如下所述。
為了說明我在說什么,這里有一個示例“框架”功能,其中缺少實際進行更改的勇氣:
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"))
您會看到命名參數的值用於匹配原始列表中的元素,而該參數的名稱被轉換為文本,然后替換了所標識的元素。 這就是目標。
只是為了解釋我的目的,我想要為數據框維護兩組獨立的名稱,一組為其顯示世界的外觀,而第二組僅可為我為此對象編寫的方法訪問。
這個怎么樣
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()
以生成所有值的列表。 然后,我們可以像常規列表一樣將其用於您感興趣的轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.