2016-08-04 53 views
0

我想在R中编写一个非常基本的IF语句并卡住。我以为我会找到有同样问题的人,但我不能。对不起,如果这之前已经解决了。R:IF对象为TRUE,然后指定对象NOT WORKING

我想检查一个变量/对象是否已分配,如果为真我想执行一个函数,它是R程序包的一部分。首先,我写了

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

我指定一个文件名作为X

FILENAME <- "FILENAME.txt" 

我运行函数

FileAssignment(FILENAME) 

我使用打印( “是的!”),并打印( “不!” )来检查IF语句是否工作,并且它确实如此。但是,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赋一个正常值。功能里面也没有工作,但是,它在外面。

+0

面点,看看'?missing'作为替代'存在()'在这种情况下。 –

+0

这完全不清楚你实际想要完成什么。无论如何,作为一个侧面说明,根据“TRUE”测试一个逻辑对象是没有意义的。删除'== TRUE'部分,这是无稽之谈。 –

回答

2

我真的不知道你在努力达到什么目的,但我想说在这种情况下使用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. 正如@NJBurgo指出并@KonradRudolph可变x将在函数内始终存在,因为它是函数的一个参数。在你的情况下,函数exists()因此不应该检查是否定义了变量x。而应该用它来验证是否存在一个名称与存储在x中的字符串相对应的变量。

    这是通过使用与deparse()组合 substitute()实现:

    if (exists(deparse(substitute(x)))) { … 
    
  2. 由于x是函数的范围内唯一定义的,超赋值操作者<<-将需要使分配给一个值x在函数外部可见,如@thothai所示。但是,功能不应该有这样的副作用。这种编程的问题包括可能与另一个名为x的变量发生冲突,该变量可能在函数体外部的不同背景中定义,以及对函数执行的操作缺乏清晰度。

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

结合这两个方面,功能可以改写这样的:

FileAssignment <- function(x){  
    if (exists(deparse(substitute(x)))) { 
    print("yes!") 
    return(parse.vdjtools(x)) 
    } else { 
    print("Nope!") 
    return(NULL)} 
} 

在这个版本的功能中,x范围仅限于函数体和功能有没有副作用效果。 FileAssignment(a)的返回值为parse.vdjtools(a)NULL,具体取决于a是否存在。 功能之外,这个值可被分配到与x

x <- FileAssignment(a) 
相关问题