在互動式的 R 操作環境之下,使用 class
函數可以立即檢查變數的類型,但是如果要在 R 的指令稿中確認變數的類型,class
函數就不是那麼方便使用了,此時可以改用 is
函數:
x <- 3 is(x, "numeric")
[1] TRUE
is
函數的第一個參數是要檢查的變數,而第二個參數則是類型名稱,它在檢查之後會傳回一個布林值(TRUE
或 FALSE
),這樣可以很方便的放在判斷式中使用,例如:
if(is(x, "class_name")) { # ... }
大部分的變數類型都會有一個對應的 is.*
檢查函數,使用這類的函數會比一般性的 is
函數更有效率一些:
is.character("gtwang")
[1] TRUE
is.*
這類的函數有很多,我們可以使用下面這行指令列出所有 ls
開頭的指令:
ls(pattern = "^is", baseenv())
[1] "is.array" "is.atomic" "is.call" [4] "is.character" "is.complex" "is.data.frame" [7] "is.double" "is.element" "is.environment" [10] "is.expression" "is.factor" "is.finite" [13] "is.function" "is.infinite" "is.integer" [16] "is.language" "is.list" "is.loaded" [19] "is.logical" "is.matrix" "is.na" [22] "is.na.data.frame" "is.na.numeric_version" "is.na.POSIXlt" [25] "is.na<-" "is.na<-.default" "is.na<-.factor" [28] "is.na<-.numeric_version" "is.name" "is.nan" [31] "is.null" "is.numeric" "is.numeric_version" [34] "is.numeric.Date" "is.numeric.difftime" "is.numeric.POSIXt" [37] "is.object" "is.ordered" "is.package_version" [40] "is.pairlist" "is.primitive" "is.qr" [43] "is.R" "is.raw" "is.recursive" [46] "is.single" "is.symbol" "is.table" [49] "is.unsorted" "is.vector" "isatty" [52] "isBaseNamespace" "isdebugged" "isIncomplete" [55] "isNamespace" "isNamespaceLoaded" "isOpen" [58] "isRestart" "isS4" "isSeekable" [61] "isSymmetric" "isSymmetric.matrix" "isTRUE"
這裡我們是使用正規表示法(regular expression)列出 baseenv
這個基礎環境中所有 is
開頭的函數,這些細節在後面的教學中會陸續介紹。
數值變數的檢查函數常用的有 is.numeric
、is.integer
與 is.double
這三個,is.numeric
對於整數或是浮點數都會傳回 TRUE
:
is.numeric(1)
[1] TRUE
is.numeric(1L)
[1] TRUE
而 is.integer
只會對於整數傳回 TRUE
:
is.integer(1)
[1] FALSE
is.integer(1L)
[1] TRUE
is.double
則是對於浮點數傳回 TRUE
:
is.double(1)
[1] TRUE
is.double(1L)
[1] FALSE
改變變數的類型稱為轉型(casting),在 R 中我們可以使用 as
來處理變數轉型的問題:
x <- "23.96" as(x, "numeric")
[1] 23.96
而上述的各種 is.*
函數通常都會有對應的 as.*
函數,運用這類的函數會比一般的性的 as
更有效率:
as.numeric(x)
[1] 23.96
將數值向量轉換為 data frame:
y <- c(25, 53, 82, 33) as.data.frame(y)
y 1 25 2 53 3 82 4 33
另外還有一種改變變數類型的方式,就是直接指定變數的類別名稱:
x <- "23.96" class(x) <- "numeric" x
[1] 23.96
is.numeric(x)
[1] TRUE