2016-12-04 10 views
0

Итак, я обнаружил это:Что происходит с тем, что R принудительно вернет строку TRUE?

> TRUE == "TRUE" 
[1] TRUE 
> TRUE == "BOO" 
[1] FALSE 
> TRUE == "true" 
[1] FALSE 
> TRUE == "T" 
[1] FALSE 
> FALSE == "FALSE" 
[1] TRUE 
> FALSE == "F" 
[1] FALSE 

Согласно документации R для logical {base}:

as.logical попытки принудить его аргумент быть логического типа. Символьные строки c («T», «TRUE», «True», «true») считаются истинными, c («F», «FALSE», «False», «false») как false, и все другие - НС.

Это на самом деле так:

> as.logical("T") 
[1] TRUE 

Таким образом, очевидно, что происходит с TRUE == "T" не является as.logical рода преобразования. Есть ли разумное объяснение поведения этих == сравнений?

+0

'ИСТИНА == Т # [1] TRUE, «T» может быть любым. Кстати, лучше TRUE вместо сокращенного T, так как это может привести к некоторым проблемам. – akrun

+0

Комментируя здесь, чтобы он также попал в @akrun .. он мог бы помочь лучше. Вот что-то я связал, но я не в состоянии интерпретировать вывод: 'trace (" == "); «TRUE» == T'> Хотя кажется, что моя интерпретация документации была правильной, было бы полезно понять ее. –

+0

Может быть, вне темы, но есть функция 'isTRUE', которая будет использоваться в тех случаях, когда ответ должен быть только ИСТИНА, и только тогда, когда он идентичен TRUE, что-либо еще приводит к FALSE (даже векторам TRUE). –

ответ

3

Вот что я сделал из него: Из документации логических сравнений ?"==":

По крайней мере один из й и у должен быть атомным вектор, но если другие является попытка списка R чтобы принудить его к типу атомного вектора: это будет успешным, если список состоит из элементов длиной один, которые могут быть принудительно применены к правильному типу. Если два аргумента являются атомарными векторами разных типов, один принуждается к типу другого, (убывающий) порядок приоритета является символом, сложным, числовым, целым, логическим и необработанным.

Мне кажется, что последняя часть этого на работе здесь. TRUE принуждается к "TRUE", и фактическое сравнение становится "TRUE"=="TRUE" вместо TRUE==TRUE.

T всегда преобразуется в TRUE так T=="TRUE" проводит. Однако `` "T" `не имеет такой удачи, когда преобразование должно произойти с .character, а не to.logical. ,

+0

Конечно, вот и все! Существуют ли какие-либо другие языки, которые будут принуждать логическое к строке, а затем сравнивать? Боже мой, ужас. – turtlegraphics

+0

Да, вы находите R зомби на заднем дворе каждый день :-) Кстати, я собирался добавить, что достоверность моей интерпретации зависит от значения «уменьшения порядка» в этом предложении .. кто-то должен уметь отслеживать, как конверсия на самом деле происходит. Как это сделать? –

+1

Никаких зомби, вы должны сравнивать яблоки с яблоками, вот и все. –

1

С точки зрения вашего вопроса, у меня возникли проблемы с представлением сценария, в котором вы оцениваете TRUE == "TRUE", vs "TRUE" == TRUE. Например; Возьмем функцию оболочки, мы можем запустить все сценарии для переменных и перебирать их с помощью тестов для as.logical, is.logical, x == TRUE, x == FALSE, x != TRUE и т.д ...

Что наша функция тестирования будет сделать, это вход и возвращать только сценарии, которые оценивают в TRUE с точки зрения логический тест в функции R.

f <-function(var){ 
    do_fun <- list(
    `%s == TRUE` = function(x)x==TRUE, 
    `%s == FALSE` = function(x)x == FALSE, 
    `as.logical(%s)` = function(x)as.logical(x), 
    `is.logical(%s)` = function(x)is.logical(x)) 

    a <- sapply(names(do_fun), function(i){ 
    do.call(do_fun[[i]],list(var)) 
    }) 
    set_name <- sprintf(names(a),var) 
    a <- as.list(a) 
    names(a) <- set_name 
    a[sapply(a,`[`,1)] 

} 

Тестирование на TRUE

# from base test to show 
> is.logical(TRUE) 
[1] TRUE 

Теперь с нашим тестирования весело

> f(TRUE) 
$`TRUE == TRUE` 
[1] TRUE 

$`as.logical(TRUE)` 
[1] TRUE 

$`is.logical(TRUE)` 
[1] TRUE 

В строках вместо зарезервированных символов

> f("true") 
$`as.logical("true")` 
[1] TRUE 

> f("TRUE") 
$`"TRUE" == TRUE` 
[1] TRUE 

$`as.logical("TRUE")` 
[1] TRUE 

На числовых значений выходной логики аль основан на оценке ввода, а не класс

> f(10.1) 
$`as.logical(10.1)` 
[1] TRUE 

> f(10.1 > 1) 
$`TRUE == TRUE` 
[1] TRUE 

$`as.logical(TRUE)` 
[1] TRUE 

$`is.logical(TRUE)` 
[1] TRUE 

или

> f(1+1) 
$`as.logical(2)` 
[1] TRUE 
+1

Прохладные примеры, спасибо! У меня также есть проблемы с реальным использованием этого, но я преподаю класс stat, в котором студент фактически использовал TRUE, а не TRUE по всему его коду, и я был gobsmacked, когда он работал. – turtlegraphics

+0

Да, это не полезно для этого, кроме, вероятно, инструктивного хаха. также писал, что спящий ... но оценка в именах может быть полезной как-то ... просто не продумала –

1

Лучше использовать isTRUE

> isTRUE 
function (x) 
identical(TRUE, x) 
<bytecode: 0x82228c8> 
<environment: namespace:base> 

> isTRUE("T") 
[1] FALSE 
> isTRUE(T) 
[1] TRUE 
> isTRUE(TRUE) 
[1] TRUE 
> isTRUE("TRUE") 
[1] FALSE 
> isTRUE("anything") 
[1] FALSE 
> isTRUE(1L) 
[1] FALSE 
> isTRUE(c(TRUE,TRUE)) 
[1] FALSE 
> 
> isTRUE(any(c(TRUE,TRUE))) 
[1] TRUE 
> isTRUE(all(c(TRUE,TRUE))) 
[1] TRUE 

> answer <- "yes" 
> isTRUE(answer %in% c("Y","Yes","y","yes")) 
[1] TRUE 
> answer <- "no" 
> isTRUE(answer %in% c("Y","Yes","y","yes")) 
[1] FALSE 
> answer <- c("Y","n") 
> isTRUE(answer %in% c("Y","Yes","y","yes")) 
[1] FALSE