2016-08-04 47 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) 
相關問題