2013-11-26 209 views
2

我想要一個函數,我可以將它應用於符合條件的任何對象,並且具有包含迴歸線條打印的很好的ggplot散點圖。將字符串傳遞給ggplot函數

但是,我不能一概而知我可以在REPL與代碼做什麼。

,所以我有這方面的工作:

require(ggplot2)  
require(xts) 
set.seed(1) 
dd = xts(cbind(rnorm(10), runif(10)), order.by = Sys.Date() + 1:10) 
names(dd) <- c('d1', 'd2') 

gp <- ggplot(data = dd, 
      aes(x = d1, y = d2)) + 
     geom_point(shape=1) + 
     geom_smooth(method = lm) 

但這種失敗

PointReg <- function(Xts, a=1, b=2) { 
    stopifnot(is.xts(Xts), 
       ncol(Xts) >1) 
    tempData <- Xts[, c(a,b)] 
    gPlot <- ggplot(data = tempData, 
       aes(x = colnames(tempData)[1], 
        y = colnames(tempData)[2])) + 
      geom_point(shape=1) + 
      geom_smooth(method = lm) 
    gPlot 
} 

我到底做錯了什麼?

回答

2

你的函數拋出一個錯誤。更具體地說,aes()嘗試將colnames(tempData)[1]作爲列名稱進行評估,並且此列不存在。

爲了解決這個問題,你必須告訴ggplot你沒有傳遞一個列名,而是一個將解析爲列名的表達式(一個字符串)。

爲此使用aes_string()。具體而言,只需將aes()替換爲aes_string()即可。試試這個:

PointReg <- function(Xts, a=1, b=2) { 
    stopifnot(is.xts(Xts), 
      ncol(Xts) >1) 
    tempData <- Xts[, c(a,b)] 
    gPlot <- ggplot(data = tempData, 
        aes_string(x = colnames(tempData)[1], 
         y = colnames(tempData)[2])) + 
    geom_point(shape=1) + 
    geom_smooth(method = lm) 
    gPlot 
} 

enter image description here

0

您可以使用索引指定列。因爲aes()試圖評估數據的列名的說法

> library(ggplot2) 
> df <- data.frame(a = 1:10, b = 1:10, c=c("x")) 
> ggplot(data = df, aes(x = df[,1], y = df[,2])) + geom_line()