2016-07-20 1 views
0

R-код ниже дает неожиданные результаты. (Я ставлю NULL в b только для тестирования. Мой интерес представляет характер «NULL»)R: почему совпадающий символ «NULL» для аргумента функции вызывает неожиданные результаты?

f <- function(a, b = c('x', 'NULLL', NULL)) { 
    print(a) 
    b <- match.arg(b) 
    print(class(b)) 
    print(b) 
    print(b == 'NULL') 
    print(b == "NULL") 
    print(is.null(b)) 

} 
f(2) 
f(2, 'x') 
f(2, 'NULL') 

Результаты выглядят следующие. Я предполагаю, что для f(2, 'NULL') должно быть напечатано 'TRUE, не так ли? Действительно странно для меня! Любые объяснения? Большое спасибо!

R 3.2.3> f(2) 
[1] 2 
[1] "character" 
[1] "x" 
[1] FALSE 
[1] FALSE 
[1] FALSE 
R 3.2.3> f(2, 'x') 
[1] 2 
[1] "character" 
[1] "x" 
[1] FALSE 
[1] FALSE 
[1] FALSE 
R 3.2.3> f(2, 'NULL') 
[1] 2 
[1] "character" 
[1] "NULLL" 
[1] FALSE 
[1] FALSE 
[1] FALSE 
+0

Кажется, соответствие «NULL» - плохая практика в R. Это? –

+1

Боковое примечание. Возможно, вы захотите посмотреть результат 'c ('x', 'NULLL', NULL)'. Третий элемент будет удален. Удаляются нули в атомных векторах. Если вам нужен истинный нулевой элемент, используйте там список. –

+0

Затем не следует печатать (b == "NULL"), чтобы создать TRUE? –

ответ

3

match.arg() делает частичное соответствие: от ?match.arg,

Сравнение производится с помощью «pmatch», поэтому «Arg» может быть сокращено.

Значение: несокращенный версия точной или уникального частичного совпадения, если есть один

так, когда аргумент b является 'NULL', match.arg(b) дает результат 'NULLL' (потому что первые четыре символа соответствия). Остальное следует за ...

+0

Тогда не следует '' print (b == "NULL") '' производить '' TRUE''? –

+1

@AaronZeng - Нет, потому что '" NULLL "! =" NULL "' –

+0

ohhhh, мой плохой! Спасибо, только что заметил, что я набрал еще один '' L'' –

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

  • Нет связанных вопросов^_^