【问题标题】:Learning how to deal with ... in functions in R学习如何在 R 中的函数中处理 ...
【发布时间】:2021-07-19 01:40:49
【问题描述】:

这是我的功能。基本上我想在其中包含一个if else 语句,但通过我在...中使用的参数的长度来控制:

这是我迄今为止尝试过的,它是错误的:

  soma_mtcars<-function(data,...){
    if(length(...) < 2){
     sum_df<- data %>% group_by() %>% summarise(total = sum(disp))
    }
    else(
      sum_df<- data %>% group_by() %>% summarise(total = sum(disp))
    )
  }

当然问题出在length(...) &lt; 2。我该如何处理?

例如,我希望输出:soma_mtcars(mtcars,cyl)soma_mtcars(mtcars, cyl, disp)

【问题讨论】:

    标签: r function dplyr


    【解决方案1】:

    您可以使用nargs(),它会为您提供total 个参数(即包括您的data 参数):

    soma_mtcars <- function (data, ...) {
        if (nargs() < 3L) { …
    }
    

    …或者你可以通过...list,得到它的结果的长度:

    soma_mtcars <- function (data, ...) {
        if (length(list(...)) < 2L) { …
    }
    

    【讨论】:

    • 谢谢!第二个选项对我不起作用。你试过了吗?
    • @Laura 是的,它对我有用(但如果您将递归 [即列表] 参数传递给函数,则需要 list 而不是 c)。但是您应该按照其他答案中的建议使用...length()。我忘记了那个功能。这是一个更好的选择。
    【解决方案2】:

    其中任何一个都将返回 dot dot 的长度。第一个是在不评估 dot dot 的情况下完成的。

    len_noeval <- function(...) ...length()
    
    len_eval <- function(...) length(list(...))
    
    # test
    
    len_noeval(11, print(12), 13)
    ## [1] 3
    
    len_eval(11, print(12), 13)
    ## [1] 12
    ## [1] 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 2017-06-23
      • 2018-03-07
      • 2018-05-18
      • 2019-04-27
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多