雙點

2013-07-06 31 views
18

我找不到周圍密度雙點的文檔雙點

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使用時,我想知道這是什麼什麼。 例如,如果我重新定義密度,然後..density單點運算符被定義爲

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

..具有不同的效果,因此它似乎XX - > ..XX ..是一位操作員。我想找出它是如何定義的。

+0

請參閱stat_bin上的文檔。 – joran

+0

這是'ggpolot2'的信號,用於自己對該值進行內部計算,而不是在工作區中查找值。 –

+0

是的,我看到了效果。我可以通過..count來取代他,以獲得經常的直方圖。但我想知道它的真正含義是什麼。如果我重新定義了影響繪圖的函數'density',那麼好玩的x - > .. x ..就是一個運算符,例如它自己的 – nicolas

回答

22

與許多其他語言不同,在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包中定義的另一個標識符。正如你所看到的,這是一個功能。

+0

真棒。所以這是基於反思的巫術。很高興知道,因爲我認爲它代表了一些R庫中的完整模式,並在ggplot中提供了一個記錄入口點。 – nicolas

+0

@nicolas:我不確定這裏是否適用術語「反思」。 'ggplot2'只是在查看數據並採取不同的行動,如果數據是以某種方式格式化的。 – krlmlr

+1

那麼綁定不是靜態的,並且是基於某個屬性即時計算的。可能並不是反射,但它看起來很接近它。 – nicolas