【问题标题】:R checking a parameter is definedR检查参数已定义
【发布时间】:2012-05-12 02:55:07
【问题描述】:

我正在寻找如何检查函数中定义的参数的一般做法。 我提出了这三个想法。哪一种是正确的做法?

不幸的是,第三个不起作用。替代()在函数中的工作方式不同,我无法弄清楚如何正确使用它。

file.names <- list(
                   cov.value <- "cov.rds",
                   plot.name <- "plot.pdf"
)

test1 <- function(file.names){
  is.save <- !missing(file.names)
}

test2 <- function(file.names = NULL) {
  is.save <- !is.null(file.names)
}

test3 <- function(file.names = NULL) {
  is.save <- exists(as.character(substitute(file.names)))
}

【问题讨论】:

  • 我已经看到前两个在很多地方都使用过。我不建议您进行第三次尝试。
  • 您可能想查看this question 的答案。我偏爱this answer
  • @BenBarnes,感谢您的链接。链接中的答案是用这个问题来测试参数是否在 ... 参数中定义。
  • @microbe,感谢您查看链接。 match.call() 会让您知道是否定义了任何参数(两个正式参数 - 在您的示例中为 file.names - 以及提供给 ... 的参数)。

标签: r function parameter-passing


【解决方案1】:

我个人认为使用默认值的第二种方法更易于使用和理解。 (而第三种方法真的很糟糕)

...尤其是当您编写需要向其传递参数的包装函数时。如何传递“缺失”值并不明显!

wraptest1 <- function(n) {
    file.names <- if (n > 0) sample(LETTERS, n) 
      else alist(a=)[[1]] # Hacky way of assigning 'missing'-value
    print(test1(file.names))
}
wraptest1(2) # TRUE
wraptest1(0) # FALSE

wraptest2 <- function(n) {
    file.names <- if (n > 0) sample(LETTERS, n) 
      else NULL # Much easier to read & understand
    print(test2(file.names))
}
wraptest2(2) # TRUE
wraptest2(0) # FALSE

[当然,还有其他方法可以解决传递缺失值的问题,但关键是使用默认值要容易得多...]

需要考虑的一些默认值是NULLNAnumeric(0)''

【讨论】:

  • 我同意使用明确的默认值。
【解决方案2】:

从经验丰富的程序员那里查看代码通常是个好主意——R 本身在 R 源代码中有大量示例。

我已经看到您的第一个和第二个示例都在使用。第一个非常地道。我个人仍然习惯性地更频繁地使用第二个。第三个我觉得太晦涩了。

【讨论】:

  • 感谢您的评论。我想第二个更传统,因为你有使用它的习惯。 :) 我会尽量坚持第二个,看看它是否适合我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2011-08-31
相关资源
最近更新 更多