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

如何看是否。。。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.

我正在为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)
}

到目前为止,它工作得很好,但我也希望潜在用户对结果有一点灵活性。例如,如果他们想要
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