R назначения внутри функций - PullRequest
0 голосов
/ 16 октября 2018
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 ]

0 голосов
/ 16 октября 2018

Вот еще один вариант, в котором используется более сложный стиль программирования:

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)
0 голосов
/ 16 октября 2018

Вам необходимо оценить 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)
...