变量不能通过函数找到(R语言)

时间:2017-10-26 04:59:15

标签: r metaprogramming

尝试使用新功能分析数据集时出现问题。 我试图通过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”?非常感谢了解这个基本问题!谢谢!

2 个答案:

答案 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)

这应该使您的功能按预期工作。