2017-10-05 53 views
0

我想知道如何創建一個函數來獲取一組命名參數,其中的參數值來自特定列表,並通過用函數參數的參數名稱替換名爲(在列表的元素名稱中但函數參數的元素值)的元素來修改列表。 (這個名稱的矢量首先是從一個數據框中獲取的,但我認爲這並不重要,下面也沒有包含它)。通過數值或邏輯矢量評估爲多個名稱或表示範圍的參數以引用形式單獨保存以供後期處理。R:如何使用命名參數來匹配和編輯命名對象列表的名稱

這似乎是一個足夠簡單的問題,但我一直無法弄清楚如何去做。關鍵的是它必須完全以編程方式完成。如下所述,我的實際功能將具有不確定性和潛在的大量參數。

爲了說明什麼,我說什麼,這裏有一個例子「框架」功能,缺少膽量,將實際進行更改:

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")) 

你看到的命名參數的值被用來匹配原列表中的元素,而從參數名稱轉換爲文本,然後替換標識的元素。這是目標。

只是爲了解釋我的目的,想要爲數據框維護兩個獨立的名稱集,一個用於顯示世界的面,另一個集只能訪問我爲此對象編寫的方法。

回答

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()生成所有值的列表。然後,我們可以像使用常規列表一樣使用您感興趣的轉換。

+0

謝謝MrFlick!這對我來說。其實我對此非常興奮 - 它使我對S3類建設的思路簡單。現在我需要它來確定將上面構造的向量作爲DF的屬性還是存儲在新列(或其他方式)中是否更有意義。 – andrewH