如何查看..R中的省略号包含某个自变量



我正在为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,或者他们想要与我指定的度量不同的度量,我希望他们能够在top_videos(...)...中传递自己的参数。

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

编辑

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

我们可以在list中捕获...,并将整个元素转换为键/值对。然后,根据名称提取元素。如果我们不传递那个特定的命名元素,它将返回NULL。我们利用NULL的这种行为来连接maxRes中的默认值10,并选择第一个元素([1](,因此如果它为NULL,则选择默认的10,否则将选择传递的值。同样,对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

最新更新