代码之家  ›  专栏  ›  技术社区  ›  stackinator Brenton Wiernik

函数内部的R赋值

  •  1
  • stackinator Brenton Wiernik  · 技术社区  · 7 年前
    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)
    
    2 回复  |  直到 7 年前
        1
  •  4
  •   moodymudskipper    7 年前

    你需要评估一下 xvar data.frame :

    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
  •  1
  •   AndS.    7 年前

    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)