文字列が有効な色表現であるかどうかを確認する 質問する

文字列が有効な色表現であるかどうかを確認する 質問する

短い質問ですが、文字列がある場合、その文字列が で有効な色表現であるかどうかをどのようにテストできますか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 

おすすめ記事