我想有一个函数可以应用于符合条件的任何对象,并且有一个很好的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
}
我做错了什么?
答案 0 :(得分:2)
由于aes()
尝试评估数据列名中的参数,因此您的函数会抛出错误。更具体地说,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
}
答案 1 :(得分:0)
您可以使用索引指定列。
> 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()