簡體   English   中英

解析 match.call 到命名列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM