尝试使用新功能分析数据集时出现问题。 我试图通过R语言在mlb11数据集中绘制命中和运行之间的关系。
该功能为
f_plot<-function(x,y,z){
ggplot(x,aes(y,z))+geom_point()+geom_smooth(method="lm")
}
如果我开始这样画:
f_plot(mlb11,hits, runs)
然后它会给出:
FUN中的错误(X [[i]],...):找不到对象'命中'
然后,如果我试试这个:
f_plot(mlb11,mlb11$hits, mlb11$runs)
它会给出 this output
这解决了这个问题!! 但我很好奇为什么函数{}无法自动读取变量名称,即使我们已经指定了数据集“mlb11”?非常感谢了解这个基本问题!谢谢!
答案 0 :(得分:0)
原因在于这一行
ggplot(x,aes(y,z))+geom_point()+geom_smooth(method="lm")
它在数据x
中寻找名为y和z的变量。最简单的&#34;解决这个问题的方法就是这样做
f_plot<-function(x,y,z){
yy <- as.character(substitute(y))
zz <- as.character(substitute(z))
code = sprintf('ggplot(x,aes(%s,%s))+geom_point()+geom_smooth(method="lm")', yy, zz)
#print(code)
eval(parse(text = code))
}
f_plot(hehe, a, b)
这可以解决问题,但不是写它的最好方法。函数substitute
将您传入的内容传递给y
并将其转换为表达式,cocdes将其转换为字符串/文本,然后放入ggplot中,然后由eval(parse())
进行评估
答案 1 :(得分:0)
这里的问题是辅助函数aes()
期望裸变量名作为输入。这意味着当您键入aes(y, z)
时,辅助函数将不会查找您提供给函数f_plot()
的变量“y”和“z”的值。相反,它将在提供的数据框中查找名为“y”和“z”的变量;独立于给予f_plot()
的y和z的值。
为避免此行为,您可以使用aes_()
:此变体不会将其输入视为裸变量名,而是将其作为以R表达式形式引用裸变量名的变量。要使这种方法起作用,您只需使用f_plot()
将函数substitute()
的“y”和“z”输入转换为R表达式。
library(ggplot2)
f_plot <- function(x, y, z) {
y <- substitute(y)
z <- substitute(z)
ggplot(x, aes_(y, z)) +
geom_point() +
geom_smooth(method = "lm")
}
df <- data_frame(var1 = 1:10, var2 = 1:10)
f_plot(df, var1, var2)
这应该使您的功能按预期工作。