使用 NSE 在函数中调用 ggplot
Call to ggplot in a function with NSE
想法是在函数中修补对 ggplot 的调用。
例子:
library(dplyr)
library(ggplot2)
library(lazyeval)
df <- data.frame(A=letters[1:10], B=2:11, C=3:12))
func <- function(name, dat=df) {
output <- dat %>%
select_(~A,name) %>%
arrange_(interp(~desc(var), var=as.name(name)))
plot <-
ggplot(output, aes_string(x=reorder(~A,-name), y=B)) +
geom_bar(stat='identity')
print(plot)
return(plot)
}
result <- func("B")
编译给出:
Error in -name : invalid argument to unary operator.
我尝试了 deparse
和 substitute
。不确定我得到了正确的组合。有任何想法吗?
在将数据传递给 ggplot
之前重新排序数据。下面的代码还在 ggplot
调用中移动了一些列名称,因为否则你总是会根据 B
绘制 A
,而不管 name
参数 -还是故意的?
function (dat, name) {
var = as.name(name)
reord = list(interp(~ reorder(var, -var), var = var))
output = dat %>%
select_(~A, name) %>% # Not actually necessary.
arrange_(interp(~ desc(var), var = var)) %>%
mutate_(.dots = setNames(reord, name))
plot = ggplot(output, aes_string(x = 'A', y = name)) +
geom_bar(stat = 'identity')
plot(plot)
plot
}
func(df, 'B')
我在这里使用 mutate_(.dots = …)
表格。查看 dplyr 的“NSE”小插图,了解有关其用法的更多信息。
想法是在函数中修补对 ggplot 的调用。
例子:
library(dplyr)
library(ggplot2)
library(lazyeval)
df <- data.frame(A=letters[1:10], B=2:11, C=3:12))
func <- function(name, dat=df) {
output <- dat %>%
select_(~A,name) %>%
arrange_(interp(~desc(var), var=as.name(name)))
plot <-
ggplot(output, aes_string(x=reorder(~A,-name), y=B)) +
geom_bar(stat='identity')
print(plot)
return(plot)
}
result <- func("B")
编译给出:
Error in -name : invalid argument to unary operator.
我尝试了 deparse
和 substitute
。不确定我得到了正确的组合。有任何想法吗?
在将数据传递给 ggplot
之前重新排序数据。下面的代码还在 ggplot
调用中移动了一些列名称,因为否则你总是会根据 B
绘制 A
,而不管 name
参数 -还是故意的?
function (dat, name) {
var = as.name(name)
reord = list(interp(~ reorder(var, -var), var = var))
output = dat %>%
select_(~A, name) %>% # Not actually necessary.
arrange_(interp(~ desc(var), var = var)) %>%
mutate_(.dots = setNames(reord, name))
plot = ggplot(output, aes_string(x = 'A', y = name)) +
geom_bar(stat = 'identity')
plot(plot)
plot
}
func(df, 'B')
我在这里使用 mutate_(.dots = …)
表格。查看 dplyr 的“NSE”小插图,了解有关其用法的更多信息。