【问题标题】:Test if an argument of a function is set or not in R测试是否在 R 中设置了函数的参数
【发布时间】:2023-03-22 18:19:01
【问题描述】:

我有一个函数f,它接受两个参数(p1p2):

如果参数p2 没有值传递给函数,则应使用p1^2 的值。但是我如何在函数中找出是否给出了一个值。问题是如果没有值,变量p2 不会被初始化。因此我无法测试p2 是否为NULL

f <- function(p1, p2) {
    if(is.null(p2)) {
        p2=p1^2
    }
    p1-p2
}

是否有可能检查p2 的值是否已传递给函数? (我找不到isset() - 函数或类似的东西。)

【问题讨论】:

    标签: r function variables variable-assignment isset


    【解决方案1】:

    为此,您使用函数missing()

    f <- function(p1, p2) {
        if(missing(p2)) {
            p2=p1^2
        }
        p1-p2
    }
    

    或者,您可以将 p2 的值默认设置为 NULL。我有时更喜欢这种解决方案,因为它允许将参数传递给嵌套函数。

    f <- function(p1, p2=NULL) {
        if(is.null(p2)) {
            p2=p1^2
        }
        p1-p2
    }
    
    f.wrapper <-function(p1,p2=NULL){
        p1 <- 2*p1
        f(p1,p2)
    }
    > f.wrapper(1)
    [1] -2
    > f.wrapper(1,3)
    [1] -1
    

    编辑:从技术上讲,您也可以使用 missing() 执行此操作,但是您还必须在 f.wrapper 中包含 missing() 语句。

    【讨论】:

    • +1 表示NULL 默认选项。回复:您添加的编辑,您将如何通过包装函数传递missing'ness?
    • @JoshO'Brien 传递 missing-ness 是复杂的 AFAIK - 但可能。这就是为什么NULL 在这种情况下要容易得多。
    • ...所以可能需要一个单独的问题来传递missing-ness。
    • @JoshO'Brien 那一定是if(missing(p2)) f(p1) else f(p1,p2)。或者您可以使用点参数传递参数。
    • 谢谢。 FWIW,如果两个函数都有正式的参数p1p2,我看不出如何用点来做到这一点。另一种选择在f.wrapper() 的正文中使用以下内容:{cl &lt;- match.call(); cl$p1 &lt;- 2*p1; cl[[1]] &lt;- f; eval(cl)}。所有这一切都表明您的NULL 替代品确实有多清洁!
    【解决方案2】:

    我认为'?missing'应该这样做。

    【讨论】:

      【解决方案3】:

      在这种情况下,你也可以使用这样的东西:

      f <- function(p1, p2 = p1 ^ 2) {
          p1-p2
      }
      

      http://adv-r.had.co.nz/Functions.html查看懒惰评估部分

      【讨论】:

      • 我一般是这样写的,那么missing什么时候最合适呢?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多