我正在研究一个在ggplot2中创建bean图的函数,并且卡在每个组的计算中位数的步骤上。我在Object not found error with ddply inside a function和Object not found error with ddply inside a function尝试了几个解决方案,但仍然无法使其工作。返回的错误消息是"Error in as.quoted(.variables) : object 'iv' not found"
,表示它没有评估
符号iv
在正确的环境中。如果可能的话,我想保留使用ggplot2美学映射将变量传递给函数的方法
我将在函数中使用与小提琴和地毯图相同的美学映射。
ggbean <- function(data = NULL, mapping = NULL, ...){
require(plyr)
x <- mapping[['x']]
y <- mapping[['y']]
# Calculate medians for each group
medFn <- function(mydat, x1, y1){
z <- do.call("ddply",list(mydat, x1, summarize, med = call("median", y1, na.rm=TRUE)))
return(z)
}
res <- medFn(data, x, y)
}
set.seed(1234)
single_df <- data.frame(dv = c(rnorm(100), rnorm(100,12,3)),
iv = as.factor(sample(LETTERS[1:4], size = 200, replace = TRUE)))
res3 <- ggbean(data = single_df, aes(x = iv, y = dv))
应提供类似
的内容 iv med
1 A 7.254916
2 B 1.367827
3 C 1.467737
4 D 8.670698
答案 0 :(得分:2)
如果你在早期“渲染”美学,你会发现生活更轻松。然后你不需要任何特殊的ddply调用:
library(ggplot2)
library(plyr)
ggbean <- function(data, mapping, ...) {
df <- quickdf(eval.quoted(mapping, data))
ddply(df, "x", summarise, med = median(y, na.rm = TRUE))
}
single_df <- data.frame(
dv = c(rnorm(100), rnorm(100, 12, 3)),
iv = sample(LETTERS[1:4], size = 200, replace = TRUE)
)
res3 <- ggbean(data = single_df, aes(x = iv, y = dv))