[英]deparsed match.call to a named list
我在我的一個函數中對調用進行了解析(以使其更具可讀性),並將其作為輸出 S3 對象的一部分包含在內,以供最終用戶參考。
func1 <- function(v1, v2, ...){
return(deparse(match.call()))
}
obj <- func1(11, 22, v3 = 33)
obj
變量現在包含:
"func1(v1 = 11, v2 = 22, v3 = 33)"
現在在另一個接受此對象作為輸入的函數中,我想將此調用字符向量轉換為命名列表,使其具有與以下相同的結構:
list(v1 = 11, v2 = 22, v3 = 33)
$v1
[1] 11
$v2
[1] 22
$v3
[1] 33
需要明確的是,我不願意按原樣存儲調用對象,因為當他們探索 S3 對象時,它不會像用戶應該的那樣提供信息(我認為程序員應該處理所有事情,而用戶應該只是享受功能)。
這個怎么樣
to_list <- function(x) {
xex <- parse(text= x )[[1]]
xex[[1]] <- quote(list)
eval.parent(xex)
}
to_list(obj)
基本上我們將字符串解析回一個表達式,然后用list()
函數交換原始函數名稱,可以對其進行評估以實際構建列表。
考慮到obj
是您在問題中顯示的字符串,您可以執行以下操作:
eval(parse(text=sub("^.+?\\(","list(",obj)))
但是如果你想在函數內部使用它,你可以執行以下操作並避免 deparsing 和 parsing:
func1 <- function(v1, v2, ...){
# catch the call
tmp_the_call <- match.call()
# convert to list
tmp_the_call <- as.list(tmp_the_call)
# remove the function name
tmp_the_call <- tmp_the_call[-1]
return(tmp_the_call)
}
# Or as one-liner
func1 <- function(v1, v2, ...){
return(as.list(match.call())[-1])
}
func1("qq", "ww", v3 = "ee", "rr")
這將導致:
$v1 [1] "qq" $v2 [1] "ww" $v3 [1] "ee" [[4]] [1] "rr"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.