【问题标题】:Variables cant be found by function (R language)函数找不到变量(R语言)
【发布时间】:2017-10-26 04:59:15
【问题描述】:

尝试使用新函数分析数据集时出现一些问题。 我正在尝试通过 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”,函数{}也不能自动读取变量名??了解更多有关此基本问题的信息将不胜感激!!谢谢!!

【问题讨论】:

  • 你能把你的例子变成人们可以运行的例子吗?例如。制作一些模拟数据
  • 列“名称”不是 R 对象名称(又名symbols)。当您键入f_plot(mlb11,hits, runs) 时,解释器正在尝试查找具有这些名称的对象。 “基本问题”是将“名称”一词用于两个完全不同的概念。

标签: r metaprogramming


【解决方案1】:

原因就在这一行

ggplot(x,aes(y,z))+geom_point()+geom_smooth(method="lm") 

它正在数据x 中寻找一个名为y 和z 的变量。解决此问题的“最简单”方法是这样做

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 的内容转换为表达式,cocodes 将其转换为字符串/文本,然后放入ggplot 中,然后由eval(parse()) 评估

【讨论】:

    【解决方案2】:

    这里的问题是辅助函数aes() 需要裸变量名作为输入。这意味着当您键入aes(y, z) 时,辅助函数将不会查找您提供给函数f_plot() 的变量“y”和“z”的值。相反,它将在提供的数据框中查找名为“y”和“z”的变量;独立于给 f_plot() 的 y 和 z 值。

    为了规避这种行为,您可以使用aes_():此变体不会将其输入视为裸变量名,而是将其视为引用 R 表达式形式的裸变量名的变量。为了使这种方法起作用,您只需使用substitute() 将函数f_plot() 的“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)
    

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

    【讨论】:

      猜你喜欢
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      相关资源
      最近更新 更多