如何查看... R 中的省略号是否包含某个参数?

How to see if ... ellipses in R contains a certain argument?

我正在为 YouTube Analytics API 编写一个包装器,并创建了一个函数,如下所示:

yt_request <- function(dimensions = NULL, metrics = NULL, sort = NULL,
                    maxResults = NULL, filtr = NULL, startDate = Sys.Date() - 30,
                                endDate = Sys.Date(), token) {
  
  url <- paste0("https://youtubeanalytics.googleapis.com/v2/reports?",
                "&ids=channel%3D%3DMINE",
                "&startDate=", startDate, 
                "&endDate=", endDate)
  
  if(!is.null(dimensions)) url <- paste0(url, "&dimensions=", dimensions)
  if(!is.null(metrics))    url <- paste0(url, "&metrics=", metrics)
  if(!is.null(sort))       url <- paste0(url, "&sort=", sort)
  if(!is.null(maxResults)) url <- paste0(url, "&maxResults=", maxResults)
  if(!is.null(filtr))      url <- paste0(url, "&filters=", filtr)
  
  r <- GET(url, token)
  return(r)
}

这意味着只是一个灵活但不是最友好的函数,因为我想要包含 yt_request() 的包装函数,这将更加用户友好。例如:

top_videos <- function(...) {
  dim <- "video"
  met <- "views,averageViewDuration"
  maxRes <- 10

  temp <- yt_request(dimensions = dim, metrics = met, maxResults = maxRes, token = myToken)
  return(temp)
}

到目前为止效果很好,但我也希望潜在用户对结果有一点灵活性。例如,如果他们想要 maxResults <- 20 而不是 10,或者他们想要与我指定的指标不同的指标,我希望他们能够在 [=15= 的 ... 中传递他们自己的参数].

我如何检查是否有人在省略号中传递参数?如果他们通过了一个指标,我希望它覆盖我指定的默认值,否则,使用默认值。

编辑

为了帮助澄清,我希望当用户决定使用该函数时,他们可以只写类似 top_videos(maxResults = 20) 的内容,该函数将忽略行 maxRes <- 10 并在 yt_request() 函数将分配 maxResults = 20 而不是 10

我们可以在 list 中捕获 ... 并将整个元素转换为 key/value 对。然后,根据名称提取元素。如果我们不传递那个特定的命名元素,它将 return NULL。我们利用 NULL 的这种行为与 maxRes 和 select 中的默认值 10 连接第一个元素 ([1]),这样如果它为 NULL,则默认 10 是 selected,否则传递的值将是 selected。同样,对 OP 想要覆盖的所有对象执行此操作

top_videos <- function(...) {

    nm1 <- list(...)
      lst1 <- as.list(nm1)
      
      dim <- c(lst1[["dimensions"]], "video")[1]
       met <- c(lst1[["metrics"]], "views,averageViewDuration")[1]
       maxRes <- c(lst1[['maxResults']], 10)[1]
       
       #temp <- yt_request(dimensions = dim, 
            metrics = met, maxResults = maxRes, token = myToken)
       #temp
       maxRes
      }

-测试

top_videos(maxResults = 20)
#[1] 20
      
  top_videos(hello = 5)
#[1] 10