如何看是否。。。R中的省略号包含某个参数?
我正在为YouTube Analytics API编写一个包装器,并创建了一个函数,如下所示:如何看是否。。。R中的省略号包含某个参数?,r,function,ellipsis,R,Function,Ellipsis,我正在为YouTube Analytics API编写一个包装器,并创建了一个函数,如下所示: yt_request <- function(dimensions = NULL, metrics = NULL, sort = NULL, maxResults = NULL, filtr = NULL, startDate = Sys.Date() - 30, endDate = Sys.
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)
}
到目前为止,它工作得很好,但我也希望潜在用户对结果有一点灵活性。例如,如果他们想要
maxResults,我们可以在列表中捕获…
,并将整个元素转换为键/值对。然后,根据名称提取元素。如果我们不传递特定的命名元素,它将返回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
}
只有当这个人指定了所有三个指标时,这难道不起作用吗?…
必须包含dim
、met
和maxRes
的参数,对吗?如果他们只指定了maxRes
,那么nm1
列表的第一个元素是应该用于maxRes
的值,但是却被分配给dim
?@Jacob如果您正在传递顶级视频(dim='something',maxRes=2),则捕获的lst
将被命名为列表
etc,即它将转换为lst1。我在问题中添加了一个编辑,希望能有所帮助。如果用户不添加参数,我只希望将默认的dim
、met
和maxRes
作为传递给yt_request()
的字符串。如果他们指定了top\u视频(maxResults=20)
,那么我想完全忽略我原来说的maxRes@Jacob,在我的帖子中尝试更新。这个想法是,如果您不传递该参数,lst1[['maxResults]]
将为空,因此c(lst1[['maxResults]],maxRes)[1]
将获得10值,否则,它将覆盖maxRes
,我们选择20Fantastic!的第一个值,正如我所希望的那样。
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