如何查看... 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
我正在为 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