短い質問ですが、文字列がある場合、その文字列が で有効な色表現であるかどうかをどのようにテストできますかR
?
私が試したことは 2 つあります。まず、関数を使用してcol2rgb()
色かどうかをテストします。
isColor <- function(x)
{
res <- try(col2rgb(x), silent = TRUE)
return(!"try-error" %in% class(res))
}
> isColor("white")
[1] TRUE
> isColor("#000000")
[1] TRUE
> isColor("foo")
[1] FALSE
動作しますが、見た目はあまり良くなく、ベクトル化されていません。2 番目は、文字列がベクトル内にあるかcolors()
、または#
長さ 4 から 6 の 16 進数が続くかを確認することです。
isColor2 <- function(x)
{
return(x %in% colors() | grepl("^#(\\d|[a-f]){6,8}$", x, ignore.case = TRUE))
}
> isColor2("white")
[1] TRUE
> isColor2("#000000")
[1] TRUE
> isColor2("foo")
[1] FALSE
動作しますが、どの程度安定しているかはわかりません。しかし、このチェックを行うための組み込み関数があるはずです。
ベストアンサー1
最初のアイデア (col2rgb()
色名の有効性をテストするために を使用する) は私には良さそうに思えますが、ベクトル化する必要があります。見た目が良いかどうかについては、R 関数の多く/ほとんどは「内部的には」特にきれいではありません。これがそもそも関数を作成する主な理由です。ユーザーから醜い内部をすべて隠します。
以下のように定義したらareColors()
、使用するのは非常に簡単です。
areColors <- function(x) {
sapply(x, function(X) {
tryCatch(is.matrix(col2rgb(X)),
error = function(e) FALSE)
})
}
areColors(c(NA, "black", "blackk", "1", "#00", "#000000"))
# <NA> black blackk 1 #00 #000000
# TRUE TRUE FALSE TRUE FALSE TRUE