【问题标题】:R assignments inside functions函数内部的 R 赋值
【发布时间】:2019-03-20 22:44:33
【问题描述】:
library(tidyverse)
xy <- data.frame(xvar = 1:10, yvar = 1:10)

plotfunc <- function(data, x, y){
  print(
    ggplot(data, aes_(x = substitute(x), y = substitute(y))) + 
      geom_line()
  )
}
plotfunc(xy, xvar, yvar)

上面的函数工作正常。下面的函数没有。如何进行如下所示的正确分配?我知道他们没有真的做任何事,但无论如何我都不想开始让我的语法正确。

plotfunc <- function(data, x, y){
  rng <- range(substitute(x), na.rm = TRUE)
  rescale <- (substitute(x) - rng[1]) / (rng[2] - rng[1])
  print(
    ggplot(data, aes_(x = substitute(x), y = substitute(y))) + 
      geom_line()
  )
}
plotfunc(xy, xvar, yvar)

【问题讨论】:

    标签: r function ggplot2 variable-assignment


    【解决方案1】:

    您需要在data.frame 的上下文中评估xvar

    plotfunc <- function(data, x, y){
      rng <- range(eval(substitute(x),envir = data), na.rm = TRUE)
      rescale <- (eval(substitute(x),envir = data) - rng[1]) / (rng[2] - rng[1])
      print(
        ggplot(data, aes_(x = substitute(x), y = substitute(y))) + 
          geom_line()
      )
    }
    plotfunc(xy, xvar, yvar)
    

    【讨论】:

    【解决方案2】:

    这是另一个使用更多 tidyverse 编程风格的选项:

    library(tidyverse)
    xy <- data.frame(xvar = 1:10, yvar = 1:10)
    
    
    plotfunc2 <- function(data, x, y){
      x <- enquo(x)
      y <- enquo(y)
      rng <- data %>% summarise(r1 = range(!!x, na.rm = TRUE)[1],
                                 r2 = range(!!x, na.rm = TRUE)[2]) 
      new_data <- data %>% mutate(rescale = (!!x - rng$r1)/(rng$r2 - rng$r1)) 
      ggplot(data, aes(x = !!x, y = !!y)) +
          geom_line()
    }
    plotfunc2(xy, xvar, yvar)
    

    【讨论】:

    • 我建议选择/拉/范围(只调用一次),而不是汇总
    猜你喜欢
    • 2016-11-12
    • 1970-01-01
    • 2012-01-02
    • 2013-04-14
    • 2023-04-11
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多