【问题标题】:Check if arguments passed into a function are defined or not in r?检查传递给函数的参数是否在 r 中定义?
【发布时间】:2020-11-14 15:42:37
【问题描述】:

我想知道在函数内部对变量应用更多操作之前,如何检查传递给函数的变量是否存在。因此,如果未找到变量,则可以使用 if-else 语句将其忽略。这是一个示例代码。请注意,变量的名称是使用“paste0”函数构造的。这是因为它们必须稍后被送入一个循环,为了简化,我省略了其余的操作。

existence = function(x1, x2, x3, x4) {
  for (i in 1:4){
    varName <-paste0("x", i)
    
    # Check if a defined variable is passed into the function
    if(exists(varName)){ 
      message(varName, " is defined")
    } else {
      message(varName, " is NOT defined")
    }
  }
}

定义的变量只有b和c。变量 a 未定义。但是,它被传递到函数中。 “存在”函数还必须打印“未定义”消息,以防将 NULL 变量传递给它。

b <- 10
c <- 5
existence(a, b, NULL, c)

我使用的“存在”功能没有给出正确答案。我希望答案是:

x1 is Not defined
x2 is defined
x3 is Not defined
x4 is defined

【问题讨论】:

  • 嗨!检查missing() 并阅读this blog post。我认为,正如作者所建议的那样,检查某些参数是否通过的最简单方法是将所有参数设置为 NA/NULL 并使用 is.na()is.null()
  • 同意你应该将所有可选参数设置为NULL作为默认值;但是,如果您将条件更改为if (tryCatch({get(varName); TRUE}, error = function(e) FALSE) &amp;&amp; !is.null(get(varName))),您的函数应该按原样工作;然而,existence(a, b, NULL, C) 也会给你一个意想不到的答案,因为C 定义的,但不是你想要的方式
  • 在实际代码中,所有参数默认设置为NULL。 missing() 不起作用。
  • @rawr,您提供的 if 语句有效。谢谢!

标签: r function undefined-variable


【解决方案1】:

您可以考虑通过变量的字符符号来测试变量的存在。将variables-to-check 作为字符向量传递并使用ls()variables-in-existence 作为字符传递

b <- 10
c <- 5

existence = function(vars_to_check, vars_created) {
    test <- vars_to_check %in% vars_created
    names(test) <- vars_to_check
    test
}

existence(
    c('a', 'b', 'NULL', 'c'), 
    ls()
)
#     a     b  NULL     c
# FALSE  TRUE FALSE  TRUE

对函数的修改允许您仅返回现有变量

existence = function(vars_to_check, vars_created) {
    test <- vars_to_check %in% vars_created
    vars_to_check[test]
}

existence(
    c('a', 'b', 'NULL', 'c'), 
    ls()
)
# 'b' 'c'

【讨论】:

    猜你喜欢
    • 2020-01-11
    • 2017-01-27
    • 1970-01-01
    • 2016-11-26
    • 2016-05-07
    • 1970-01-01
    • 2017-12-25
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多