2011-04-01 93 views
8

我無法得到我的頭。對象未找到ggplot2的錯誤

這些例子的工作:

# Function with geom_density 

gr.den <- function(var.name) { 
    ggplot(results, aes(get(var.name), fill = name)) + 
    geom_density(alpha = 0.2) + 
    geom_vline(xintercept = tv[, var.name], color="red", size=1) + 
    xlab(var.name) 
} 

gr.den("sum.Empl") 

# Example with geom_point 

ggplot(results, aes(sum.All, sum.Empl)) + 
    geom_point(alpha = 1/5) + 
    opts(aspect.ratio = 1) + 
    facet_grid(. ~ name) 

然後我試圖使用geom_point創建類似的功能:

gr.sc <- function(var.name.1, var.name.2) { 
    ggplot(results, aes(get(var.name.1), get(var.name.2))) + 
    geom_point(alpha = 1/5) + 
    opts(aspect.ratio = 1) + 
    facet_grid(. ~ name) 
} 

gr.sc("sum.All", "sum.Empl") 

而且我得到這個錯誤。爲什麼?

Error in get(var.name.1) : object 'var.name.1' not found 
+1

請提供一個可重複的示例。看起來我們需要'results'和'tv'的內容來運行你的代碼。運行'dput()'並將結果粘貼到你的問題中。 – Chase 2011-04-01 14:02:05

回答

18

如果您打算在函數中使用aes,最好使用aes_string來代替。

gr.sc <- function(var.name.1, var.name.2) { 
    ggplot(results, aes_string(x = var.name.1, y = var.name.2)) + 
    geom_point(alpha = 1/5) + 
    opts(aspect.ratio = 1) + 
    facet_grid(. ~ name) 
} 

gr.sc("sum.All", "sum.Empl") 

HTH

+0

非常感謝! 'aes_string'幫助很大。我在第一個函數gr.den中發現了一個錯誤,並通過'aes_string'解決了它。 – djhurio 2011-04-01 14:42:39

4

因爲get被找錯環境中發生錯誤(即,不是results數據幀的內部)。你可以明確指定get(var.name.1, envir = results),但那會是很醜陋的代碼。正如Iselzer所建議的那樣,使用aes_string更好。

1

我碰到類似這樣的問題:https://groups.google.com/forum/#!topic/ggplot2/_kKP4NNu3bc 其中aes_string不起作用。

這可能會在更高版本的ggplot2中解決。但出於兼容性原因,我使用的是舊版本的ggplot2。對我而言,快速破解是將函數參數設置爲全局變量,即

gr.sc <- function(var.name.1, var.name.2) { 
    var.name.1 <<- var.name.1 
    ... 
    ggplot(... 
    ... 
} 
相關問題