[英]match.call with function call supplied
我想捕獲所有參數和值並返回一個命名列表。 我遇到的情況是提供的值是函數調用。
下面產生了一個“ call”類的對象,這對我來說不方便,因為我想在其上調用paste
:
fun1 = function(a = 1) as.list(match.call()[-1])
value1 = fun1(a = letters[1:2])
class(value1[[1]])
[1] "call"
paste(value1[[1]], collapse = " - ")
[1] "[ - letters - 1:2" #not useful to me
作為一種解決方法,我可以調用eval
獲取由c
創建的字符向量(lapply函數用於說明當有多個參數時,將對所有參數調用eval
):
fun2 = function(a = 1) lapply(as.list(match.call()[-1]), eval)
value2 = fun2(a = letters[1:2])
class(value2[[1]])
[1] "character"
paste(value2[[1]], collapse = " - ")
[1] "a - b" #that's what I want
有一個更好的方法嗎? 對一堆東西調用eval
只是為了獲取值對我來說有點奇怪。
編輯:這背后的想法是,我想將參數列表傳遞給原始函數內的函數(該函數接受其中一個參數的命名列表)。 我想捕獲用戶提供的值和默認值(用於用戶未提供任何內容的參數)。
我在其他地方學到,可以將match.call
和formals
結合使用來獲得所有這些。 但是然后,說我需要將其傳遞給httr::GET
函數的query
參數,並在此之前對其進行一些處理(例如在“ a”和“ b”之間添加“-”)。 然后,我得到類似“ [-字母-1:2”而不是“ a-b”的內容。
我感覺如果答案使用eval
,那么我可能會問錯問題。
我感覺到您正在尋找更通用的東西,因此不確定這是否完全是您要尋找的東西,但它更簡單並且可以為您提供所需的結果。 關鍵是do.call()
fun1 = function(a = 1) {
L1 <- as.list(match.call())
do.call(paste0, list(L1$a, sep="", collapse=" - "))
}
value1 = fun1(a = letters[1:2])
好吧,我認為您需要確定代碼的哪些部分需要評估,哪些不需要。
從您的示例中還不能完全清楚您想要的通用性,但是您可以通過一個簡單的list()解決您的example-question問題,您只需要一個自定義函數即可提供默認值:
myfun <- function(a=1) list(a=a)
value <- myfun(a=letters[1:2]))
paste(value[[1]], collapse = " - ")
# Basically: value <- list(a=letters[1:2])), or paste(letters[1:2], collapse= " - ")
通常,您使用不帶任何參數的match.call()來找出調用函數的方式。 有時了解是否調用了fun(a = c('a','b'))或fun1(a =字母[1:2])很有用,所以match.call會告訴您這一點,而不進行任何評估。
因此,如果您想對參數進行實際操作,只需直接調用它們,以后便可以將其傳遞給另一個函數
mypaste <- function(..., sep=' -CustomSep- ', collapse=' -Mycollapse- ', prefix='Value:') {
if(length(list(...))>0) {
paste(prefix, ..., sep=sep, collapse=collapse)
} else {
text <- character(0)
}
}
此功能只是粘貼的一種變體,但是您可以根據需要對其進行擴展。
而且,我得到的印象是,您需要一個一般情況,即您將參數與另一個函數的參數進行匹配,但是要回答該問題,我需要更多地了解您到底想完成什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.