2013-10-04 3 views
4

Я прописан эту функцию с несколькими тестовыми:Функция дает мне всегда завершающая `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 также невидимо.

Смежные вопросы