38

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

それがどれほど安定しているかはわかりませんが、これは機能します。しかし、このチェックを行うための組み込み関数が必要だと思われますか?

4

2 に答える 2

25

あなたの最初のアイデア(あなたの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 
于 2012-11-08T14:21:59.880 に答える
6

編集を考慮して更新

?parR で色を指定する方法の完全な説明を提供します。有効な色を解決するには、次の点を考慮する必要があります。

  1. にリストされている名前付きの色colors()
  2. "#RRGGBBAA赤、緑、青、およびアルファ チャネルを指定する形式の文字としての 16 進数表現。アルファ チャネルは透過性のためのものであり、すべてのデバイスがサポートしているわけではないため、このように 8 つの 16 進数値で色を指定することは有効ですが、特定のデバイスでは無効な場合があります。
  3. NA有効な「色」です。これはtransparentを意味しますが、R に関する限り、有効な色表現です。
  4. 同様"transparent"に も有効ですが、 では有効ではないcolors()ため、これも処理する必要があります
  5. 1によって返される小さな色パレットの色のインデックスであるため、有効な色表現です。palette()

    > palette()
    [1] "black"   "red"     "green3"  "blue"    "cyan"    "magenta" "yellow" 
    [8] "gray"
    

    したがって、対処する必要があります1:8。これが重要な理由は、これらの色のインデックスを文字として表現することも有効であるため、有効な色表現として?parキャプチャする必要があることをよく示しています。"1"ただし(コメントで@hadleyが指摘したように)これはデフォルトのパレット用です別のパレットがユーザーによって使用される場合があります。その場合、R のバージョンで許可されている最大長のベクトルの要素への文字インデックスを考慮する必要があります。

それらをすべて処理したら、準備完了です ;-)

私の知る限り、これを行うユーザーに表示される関数はありません。これらはすべて、プロットを行う C コード内に埋もれています。すぐに.Internal(....)陸地にたどり着き、ドラゴンがいます!


オリジナル

[衒学的であることは、Rの色の名前で#000000 はありません。]

R が知っている唯一の色の名前colors()は、 によって返されるものです。はい、#000000R が理解できる色表現の 1 つですが、名前について具体的に尋ねます。決定的なリストまたは解決策はx %in% colors()、2 番目の例のとおりです。

これは、ほぼ安定しています。のような色を使用するとcol = "goldenrod"、内部的に R は、プロットしているデバイスの色の「適切な」表現とこれを一致させます。color()R がこれを検索できる色名のリストを返します。含まれていない場合はcolors()、色の名前ではありません。

于 2012-11-08T13:14:07.347 に答える