2013-10-04 77 views
4

我已經writen這個功能與幾個測試案例:功能讓我總是尾隨`NULL`回

characterCounter <- function(char1, char2) { 
    if(is.null(char1) || is.null(char2)) { 
     print("Please check your character sequences!") 
     return() 
    } 

    if(nchar(char1, type = "chars") < nchar(char2, type = "chars") || nchar(char1, type = "chars") <= nchar(char2, type = "chars")) { 
     cat(sprintf("%s is smaller or smaller-equal than %s\n", char1 , char2)) 
     return() 
    } else if(nchar(char1, type = "chars") > nchar(char2, type = "chars") || nchar(char1, type = "chars") >= nchar(char2, type = "chars")) { 
     cat(sprintf("%s is greater or greater-equal than %s\n", char1 , char2)) 
     return() 
    } else if(nchar(char1, type = "chars") == nchar(char2, type = "chars")) { 
     cat(sprintf("%s is equal to %s\n", char1, char2)) 
     return() 
    } 
} 

#Testcases 
(characterCounter("Hello","Hell")) 
(characterCounter("Wor","World")) 

然而,每個案例後,我得到的結果:

> (characterCounter("Hello","Hell")) 
Hello is greater or greater-equal than Hell 
NULL 
> (characterCounter("Wor","World")) 
Wor is smaller or smaller-equal than World 
NULL 

我也不是什麼就像我的輸出是尾隨NULL。爲什麼我回來了? (characterCounter(NULL,NULL))

UPDATE

characterCounter <- function(char1, char2) { 
    if(is.null(char1) || is.null(char2)) { 
     return(cat("Please check your character sequences!")) 
    } 

    if(nchar(char1, type = "chars") < nchar(char2, type = "chars") || nchar(char1, type = "chars") <= nchar(char2, type = "chars")) { 
     return(cat(sprintf("%s is smaller or smaller-equal than %s\n", char1 , char2))) 
    } else if(nchar(char1, type = "chars") > nchar(char2, type = "chars") || nchar(char1, type = "chars") >= nchar(char2, type = "chars")) { 
     return(cat(sprintf("%s is greater or greater-equal than %s\n", char1 , char2))) 
    } else if(nchar(char1, type = "chars") == nchar(char2, type = "chars")) { 
     return(cat(sprintf("%s is equal to %s\n", char1, char2))) 
    } 
} 

回答

3

你得到NULL因爲這是你返回的內容。嘗試使用invisible

f1 = function() { 
    cat('smth\n') 
    return() 
} 

f2 = function() { 
    cat('smth\n') 
    return(invisible()) 
} 

f1() 
#smth 
#NULL 
f2() 
#smth 

請注意,如果您有額外的括號的輸出,你還是會得到NULL

(f2()) 
#smth 
#NULL 

最後,作爲一個普通的編程說明,我認爲除了單行者之外,非常希望在函數和解決方案中使用return聲明,以避免不返回輸出並不是那麼好。

3

R中的每個函數都會返回一些值。如果沒有明確的返回值,它將是return調用或上次評估語句的參數。

考慮三個功能:

f1 <- function() { 
    cat("Hello, world!\n") 
    return (NULL) 
} 

f2 <- function() { 
    cat("Hello, world!\n") 
    NULL 
} 

f3 <- function() { 
    cat("Hello, world!\n") 
} 

當你運行它們,你就會得到:

> f1() 
Hello, world! 
NULL 
> f2() 
Hello, world! 
NULL 
> f3() 
Hello, world! 

然而,第三個功能也返回NULL,你可以很容易地通過分配x <- f3()和評估x檢查。爲什麼區別?

原因是某些函數返回它們的值隱式地,即使用invisible()函數,並且當您在頂層評估函數時,不會打印這些值。例如。

f4 <- function() { 
    cat("hello, world!\n") 
    invisible(1) 
} 

將返回1(如可以通過指定它的返回值,一些變量檢查),但是從頂層調用時不會打印1。事實證明,cat不可見地返回它的值(它總是NULL),因此f3的返回值也是不可見的。