簡體   English   中英

提供函數調用的match.call

[英]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.callformals結合使用來獲得所有這些。 但是然后,說我需要將其傳遞給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.

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