【问题标题】:R - check if a variable existsR - 检查变量是否存在
【发布时间】:2016-12-28 22:26:28
【问题描述】:

我以为我已经解决了这个问题。我有一个变量叫做:

count_1

它只是一个包含一个元素的向量。当我遍历我的循环时,有时它有一个价值,而在其他时候它没有。我想要做的就是询问它是否包含任何内容,如果没有,只需循环回来。现在我的脚本失败了,因为当 count_1 为空时,我得到了这个:

需要 TRUE/FALSE 的地方缺少值 执行停止

这是我目前的尝试:

if (exists("count_1"))
  { 
    #code#
  }

【问题讨论】:

  • @RonakShah 嗯,如果没有count_1,我认为这将失败。 if (exists("count_1") && !is.na(count_1)) 或两个嵌套的ifs。
  • 实际上您提到的上述代码应该可以工作,除非它的na。如果在循环中只使用else { next } 我猜应该可以。事实上,我尝试了类似的方法并且它有效 - a <- 5 rm(b) if(a%%2 == 0 ) { b <- 1 } if(exists("b")) { print('hi') }else { print('bye') }
  • @zx8754 我相信他们的#code# 包含一些带有逻辑比较或类似内容的子集。
  • @zx8754 是的,他们正试图通过if 条件来避免它。
  • 永远不要使用exists作为通用代码。这是一个支持基础架构编程的函数,它根本不应该出现在普通分析(或一般用户级)代码中:如果您编写代码,您应该知道变量是否存在。在代码中提出问题肯定表明代码中存在逻辑错误。

标签: r


【解决方案1】:

使用if(length(count_1) == 1) { next }检查count_1中是否有值。

但是,这只有在您的代码执行以下操作时才有效:

dat <- 1:5
count_1 <- which(dat > 10)
count_1
# integer(0)
length(count_1) == 1
# [1] FALSE

它不适用于其他填充变量的方式,例如:

count_1 <- ifelse(any(dat > 10), which(dat > 10), NA)
count_1
# [1] NA
length(count_1) == 1
# [1] TRUE

【讨论】:

  • 建议:或许把空和NA这两种可能性结合起来比较好,像这样:if (length(count_1) &amp;&amp; !is.na(count_1))...
  • @RHertel 绝对。如果我们知道 OP 是谁创建了变量,我们就可以提供一个防弹的解决方案。
【解决方案2】:

出于不同的原因,我需要检查函数中是否存在变量。我用这个:

check=function(x) tryCatch(if(class(x) == 'logical') 1 else 1, error=function(e) 0) 
varX=1 
check(varX)
[1] 1
rm(varX)
check(varX)
[1] 0
f1= function(x) if(check(x)) cat('exists') else cat('not exists')
f1(varX)
not exists

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 2013-11-13
    • 2014-06-23
    • 2017-08-05
    • 2010-10-25
    • 2011-12-16
    • 2017-02-13
    • 2011-12-19
    相关资源
    最近更新 更多