2014-10-28 84 views
2

我對R比較陌生。在閱讀文檔時,下面的句子讓我困惑。何時is.vector()返回true?

is.vector()不測試對象是否是向量。相反,只有當對象是一個除名稱之外沒有屬性的向量時纔會返回TRUE。

other thread關於爲什麼is.vector()返回TRUE列表可能是一個很好的參考。

is.vector()是什麼時候返回true?

回答

2

不同數據類型的一些示例。

x <- list(
    "integer vector" = integer(), 
    "numeric vector" = numeric(), 
    "character vector" = character(), 
    "logical vector" = logical(), 
    "complex vector" = complex(), 
    "raw vector"  = raw(), 
    list    = list(), 
    expression   = expression(), 
    factor    = factor(), 
    pairlist   = pairlist(), 
    "numeric matrix" = matrix(1), 
    "character matrix" = matrix("a"), 
    data.frame   = data.frame(), 
    formula   = y ~ x, 
    "function"   = identity, 
    call    = call("identity", 1), 
    name    = as.name("a"), 
    null    = NULL, 
    environment  = new.env() 
) 
vapply(x, is.vector, logical(1)) 
## integer vector numeric vector character vector logical vector 
##    TRUE    TRUE    TRUE    TRUE 
## complex vector  raw vector    list  expression 
##    TRUE    TRUE    TRUE    TRUE 
##   factor   pairlist numeric matrix character matrix 
##    FALSE   FALSE   FALSE   FALSE 
##  data.frame   formula   function    call 
##    FALSE   FALSE   FALSE   FALSE 
##    name    null  environment 
##    FALSE   FALSE   FALSE 

factorlist的結果並不完全直觀,所以要小心那些。通常你想要is.atomic而不是is.vector

+0

+1 for'is.atomic'。 – shadowtalker 2014-10-28 14:26:54

2

is.vector()不測試對象是否是向量。相反,只有當對象是除名稱之外沒有屬性的矢量時,纔會返回TRUE

這句話的意思正是它所說的。 爲什麼它說它說的更微妙。

所有R跟對象與「屬性」用attr()列表,attributes()可見(對於整個列表)(個別屬性)相關聯。事實上,對象的類實際上只是一個特殊的屬性,通用(S3)函數用來確定使用哪種方法。

該屬性在大多數情況下傾向於「安靜」,但在na.omit()函數的輸出中可見(嘗試x <- c(1, NA); y <- na.omit(x); print(y)以查看它的外觀)。這裏,y有一個屬性,na.action,它本身是一個屬性爲class的對象。使用z <- attr(y, "na.action")將該屬性指定給單獨的對象,然後使用attributes(z),然後attr(z, "class")查看其屬性。

class屬性存在時,R使用它來覆蓋基礎對象的類;在這種情況下,omit類將覆蓋內部integer類。嘗試attr(z, "class") <- NULL; class(z)。請注意,這與直接編寫class(z) <- NULL的結果相同。

現在再將z分配給z <- attr(y, "na.action")。試試is.vector(z)。然後再次用NULL刪除它的班級,然後再次嘗試is.vector(z)。希望這應該明確什麼is.vector檢查。 class屬性在方法調度中有特殊用處的事實是無關緊要的。實際上,您可以爲y做同樣的事情:嘗試is.vector(y),is.vector(x[!is.na(x)])

這個標準的原因是R中許多不看起來或行爲像矢量的對象在內部存儲爲向量。矩陣屬於這一類。嘗試類似x <- matrix(1:4, 2); dput(x)。您會注意到x在內部保存爲矢量1:4,具有特殊屬性.Dim。該屬性隱藏且無法訪問;嘗試attr(x, ".Dim")

這是所有記錄在R手冊(這是我第一次看到它)的某處,但我不記得哪一節。