31

密度の周りの二重ドットのドキュメントが見つかりません

set.seed(1234)
df <- data.frame(cond = factor(rep(c("A","B"), each=200)), rating = c(rnorm(200),rnorm(200, mean=.8)))
print(head(df))
print(ggplot(df, aes(x=rating)) + 
    geom_histogram(aes(y=..density..),      # Histogram with density instead of count on y-axis
                   binwidth=.5,
                   colour="black", fill="white") +
    geom_density(alpha=.2, fill="#FF6666") +
    geom_vline(aes(xintercept=mean(rating, na.rm=T)),   # Ignore NA values for mean
               color="red", linetype="dashed", size=1))

それらが表す演算子を知っていますか?

編集

geom で使用するとどうなるか知ってます。それが何であるかを知りたいです。たとえば、単一ドット演算子は次のように定義されます。

> .
function (..., .env = parent.frame()) 
{
    structure(as.list(match.call()[-1]), env = .env, class = "quoted")
}
<environment: namespace:plyr>

Densityを再定義すると、..density..の効果が異なるため、XX -> ..XX.. が演算子のように見えます。どのように定義されているのか知りたいです。

4

1 に答える 1

34

他の多くの言語とは異なり、R では、ドットは識別子として完全に有効です。この場合、..count..は識別子です。ggplot2ただし、このパターンを検出してドットを取り除くための特別なコードがあります。実際のコードがそのようにフォーマットされた識別子を使用する可能性は低いと思われるため、これは定義された美学と計算された美学を区別するための巧妙な方法です。

関連するコードはlayer.rの最後にあります:

# Determine if aesthetic is calculated
is_calculated_aes <- function(aesthetics) {
  match <- "\\.\\.([a-zA-z._]+)\\.\\."
  stats <- rep(FALSE, length(aesthetics))
  grepl(match, sapply(aesthetics, deparse))
}

# Strip dots from expressions
strip_dots <- function(aesthetics) {
  match <- "\\.\\.([a-zA-z._]+)\\.\\."
  strings <- lapply(aesthetics, deparse)
  strings <- lapply(strings, gsub, pattern = match, replacement = "\\1")
  lapply(strings, function(x) parse(text = x)[[1]]) 
}

関数のさらに上で使用されmap_statisticます。計算された美学が存在する場合、別のデータ フレーム (count列などを含むもの) がプロットに使用されます。

単一のドットは、パッケージ.で定義された単なる別の識別子です。plyrご覧のとおり、関数です。

于 2013-07-06T19:12:39.610 に答える