函数内的 R 赋值
R assignments inside functions
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)
您需要在 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)
这是另一个使用更多 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)
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)
您需要在 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)
这是另一个使用更多 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)