我试图根据这个可重复的例子制作一个可重复使用的图表功能:
test=data.frame(name=c('a', 'b', 'c', 'd', 'e', 'f'), amount=c(1,7,3,11,2,1))
ggplot(transform(test, name=reorder(name, -amount)),
aes(x=name, y=amount)) +
geom_bar(stat='identity')
我遇到的问题是让transform
功能正常工作。
此功能有效,但没有transform
:
p = function(df, x, y) {
ggplot(df,
aes_string(x=x, y=y)) +
geom_bar(stat='identity')
}
p(test, 'name', 'amount')
当我添加transform
函数时,我会得到相同的图表:
p_order = function(df, x, y) {
ggplot(transform(df, x=reorder(x, -y)),
aes_string(x=x, y=y)) +
geom_bar(stat='identity')
}
p_order(test, 'name', 'amount')
但是发出警告:Warning message:
In mean.default(X[[1L]], ...) :
argument is not numeric or logical: returning NA
我尝试在x=reorder(x, -y)
,get
,eval
,substitute
中包含quote
的不同部分。我现在已经尝试了几个小时,认为这是某种promise
概念,我只是没有把握。
答案 0 :(得分:2)
使用赋值和[[]]
而不是转换最容易做到:
p_order = function(df, x, y) {
df[[x]] <- reorder(df[[x]], -df[[y]])
ggplot(df, aes_string(x=x, y=y)) +
geom_bar(stat='identity')
}
p_order(test, 'name', 'amount')
如果您想使用转换,可以将其与get
一起使用,但只能在将其分配给新列时使用(否则您将不得不开始弄乱do.call
:
p_order = function(df, x, y) {
ggplot(transform(df, new_col = reorder(get(x), -get(y))),
aes_string(x = "new_col", y=y)) +
geom_bar(stat='identity') +
xlab(x) # to keep it looking the same
}
p_order(test, 'name', 'amount')