2016-12-04 54 views
0

所以,我發現了這一點:R強制「TRUE」字符串爲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 

根據對logical {base}的R文件:

as.logical試圖強迫其參數是邏輯類型。 將字符串c(「T」,「TRUE」,「True」,「true」)視爲真, c(「F」,「FALSE」,「False」,「false」)爲false,其他人不適用。

這實際上是這樣的:

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

因此很明顯,這是怎麼回事與TRUE == "T"不是as.logical排序轉換。這些==比較的行爲是否有任何合理的解釋?

+0

'TRUE ==Ť #[1] TRUE' ''T「'可以是任何東西。順便說一句,最好是TRUE而不是縮寫T,因爲它可能導致一些問題 – akrun

+0

在這裏評論,所以它也去@akrun ..他可能會更好地幫助。這是我綁定的東西,但無法解釋輸出:'trace(「==」); 「TRUE」== T'>雖然看起來我對文檔的解釋是正確的,但進一步的見解會有所幫助。 –

+0

可能不是主題,但有一個函數'isTRUE'用於答案必須爲TRUE且僅與TRUE相同的情況,否則其他任何結果爲FALSE(甚至向量爲TRUE)。 –

回答

3

這裏是我做了什麼吧: 從邏輯比較?"=="的文檔:

至少有X和Y之一必須是原子的載體,但如果對方是一個列表[R嘗試將其強制爲原子向量的類型:如果列表由長度爲1的元素組成,那麼該元素將被強制轉換爲正確的類型。 如果兩個參數是不同類型的原子向量,則強制轉換爲另一種類型的原子向量,優先順序(字符,複數,數字,整數,邏輯和原始)的(減少)順序。

對我來說,這似乎是後期工作在這裏。 TRUE被強制爲"TRUE",實際比較結果變爲"TRUE"=="TRUE"而不是TRUE==TRUE

T總是被轉換爲TRUE因此T=="TRUE"成立。但是當轉換髮生到字符而不是邏輯時,``「T」`沒有這樣的運氣。 。

+0

當然,就是這樣!是否還有其他語言將強制布爾值轉換爲字符串,然後進行比較?我的上帝,恐怖。 – turtlegraphics

+0

是的,你每天都會在後院發現R殭屍:-)順便說一句,我要補充一點,我的解釋的準確性取決於該句子中「遞減順序」的含義..有人應該能夠跟蹤轉換實際上正在發生。如何做到這一點? –

+1

根本沒有殭屍,你必須將蘋果與蘋果進行比較,就是這樣。 –

1

在您提出的問題中,我很難想象您將評估TRUE == "TRUE",與"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

很酷的例子,謝謝!我也很難想象這是一個真正的用法,但是我正在教一個統計課,其中一個學生實際上在他的代碼中實際上使用了「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 
相關問題