R:IF对象为TRUE,然后分配对象NOT WORKING

时间:2016-08-04 09:21:23

标签: r if-statement

我正在尝试在R中编写一个非常基本的IF语句并且卡住了。我以为我找到了同样问题的人,但我不能。对不起,如果以前已经解决了这个问题。

我想检查是否已分配变量/对象,如果是,我想执行属于R包的函数。首先我写了

FileAssignment <- function(x){
  if(exists("x")==TRUE){
    print("yes!")
    x <- parse.vdjtools(x)
  } else { print("Nope!")}
}

我将文件名指定为x

FILENAME <- "FILENAME.txt"

我运行功能

FileAssignment(FILENAME)

我使用print(&#34; yes!&#34;)并打印(&#34; Nope!&#34;)来检查IF-Statement是否有效,确实如此。但是,未分配parse.vdjtools(x)部分。现在我在函数之外测试了相同的IF语句:

if(exists("FILENAME1")==TRUE){
  FILENAME1 <- parse.vdjtools(FILENAME1)
}

这很有效。我读到here可能是因为函数使用了{}而if语句也是如此。所以我应该从if语句中删除括号。

FileAssignment <- function(x){
  if(exists("x")==TRUE)
    x <- parse.vdjtools(x)
   else { print("Nope!")
}

也没用。

我认为它可能与特定的parse.vdjtools(x)函数有关,所以我只是尝试使用x <- 20为x分配一个正常值。也没有在函数内部工作,但是,它在外面。

2 个答案:

答案 0 :(得分:3)

我真的不知道你想要实现什么,但是我知道在这种情况下使用exists是错误的。 x无法在函数内部存在。见这个例子

# All this does is report if x exists
f <- function(x){
       if(exists("x"))
         cat("Found x!", fill = TRUE)
     }

f()
f("a")
f(iris)

# All will be found!

调查file.exists而不是?这是矢量化的,因此可以同时调查文件向量。

答案 1 :(得分:1)

你提出的问题不像你想象的那么简单。为了获得理想的行为,有两点需要解决,特别是第一点有些棘手:

  1. 正如@NJBurgo和@KonradRudolph所指出的,变量x将始终存在于函数中,因为它是函数的参数。因此,在您的情况下,函数exists()不应检查变量x是否已定义。相反,它应该用于验证是否存在x中存储的与字符串对应的名称的变量。

    这是通过使用deparse()substitute()的组合来实现的 if (exists(deparse(substitute(x)))) { …

    x
  2. 由于<<-仅在函数范围内定义,因此超级对齐运算符x需要在函数外部显示分配给x的值,如由@thothai建议。但是,功能不应该有这样的副作用。这种编程的问题包括可能与另一个名为FileAssignment <- function(x){ if (exists(deparse(substitute(x)))) { print("yes!") return(parse.vdjtools(x)) } else { print("Nope!") return(NULL)} } 的变量发生冲突,该变量可以在函数体外部的不同上下文中定义,以及关于函数执行的操作缺乏明确性。

    更好的方法是返回值,而不是将其分配给变量。

  3. 结合这两个方面,可以像这样重写函数:

    x

    在此版本的函数中,FileAssignment(a)的范围仅限于函数体,函数没有副作用。 parse.vdjtools(a)的返回值为NULLa,具体取决于x是否存在。 在函数外部,可以使用

    将此值分配给x <- FileAssignment(a)
    window.currentIndex=0;