Я пытаюсь присвоить график списку, названному через переменную (snm). Мой фрагмент кода — это все варианты, которые я пытался сделать, чтобы заставить его работать. Какой еще вариант мне не хватает? Спасибо.
Моя цель состоит в том, чтобы перебрать мои назначения графика, используя оператор IF, чтобы изменить snm и несколько других переменных, которые я буду использовать в графиках.
for (x in seq(0,1)) {
if (x==0) {
snm="grad"
}
else if (x==1) {
snm="start"
}
assign(snm,list(),envir=.GlobalEnv) #works
assign(snm[[1]],ggplot(data=TDSF, aes(x=Graduation))+geom_histogram()+labs(title="A"),envir=.GlobalEnv) #works
assign(snm[[2]],ggplot(data=TDSF, aes(x=Graduation,weights=Donation))+geom_bar()+labs(title="B"),envir=.GlobalEnv) #fails "subscript out of bonds"
assign(snm[[3]],ggplot(data=TDSF, aes(x=State,weights=Donation))+geom_bar()+labs(title="B")+scale_y_sqrt(),envir=.GlobalEnv) #fails "subscript out of bonds"
grid.arrange(grad[[1]],grad[[2]],grad[[3]])
}
Частичное решение, основанное на @MrFlick и @hrbrmstr, но 1) я должен использовать do.call в цикле, иначе я получаю те же графики и 2) видя mapply, я чувствую, что должен иметь возможность его использовать, но не могу заставить его Работа.
library(ggplot2)
library(gridExtra)
set.seed(1492)
TDSF <- data.frame(Graduation=sample(1950:2010, 30),
Donation=sample(300:10000, 30),
Start.Year=sample(1950:2010,30),
State=sample(state.abb,30,replace=TRUE))
plots <- list()
for (x in seq(0,1)) {
if (x==0) {
nm=quote(Graduation)
snm="grad"
}
else if (x==1) {
nm=quote(Start.Year)
snm="start"
}
plots[[snm]]<-list()
plots[[snm]][[1]] <- ggplot(data=TDSF, aes(x=eval(nm)))+geom_histogram()+labs(title=paste("Number of People per",snm,"Year"))
plots[[snm]][[2]] <- ggplot(data=TDSF, aes(x=eval(nm),weights=Donation))+geom_bar()+labs(title=paste("Donations by",snm,"Year"))
plots[[snm]][[3]] <- ggplot(data=TDSF, aes(x=State,weights=Donation))+geom_bar()+labs(title="Donations by State")+scale_y_sqrt()
}
do.call(grid.arrange,plots[["grad"]])
do.call(grid.arrange,plots[["start"]])
попытка сопоставления:
plot<-mapply(function(snm,nm) list(
{ggplot(data=TDSF, aes(x=nm))+geom_histogram()+labs(title=paste("Number of People per",snm,"Year"))},
{ggplot(data=TDSF, aes(x=nm,weights=Donation))+geom_bar()+labs(title=paste("Donations by",snm,"Year"))},
{ggplot(data=TDSF, aes(x=State,weights=Donation))+geom_bar()+labs(title="Donations by State")+scale_y_sqrt()}
), c("grad","start"),c("Graduation","Start.Year"),SIMPLIFY = FALSE)
do.call(grid.arrange,plot[["grad"]])
do.call(grid.arrange,plot[["start"]])
assign()
. Я предлагаю вам избавиться от этой привычки как можно скорее. - person MrFlick   schedule 20.08.2016eval()
. Обычно вам просто нужно разумно использовать именованные списки. Это то, с чем большинство функций лучше всего работают, а не с набором отдельных переменных. Если вам нужны две коллекции, одна для выпускного и для начала, используйтеx <- list(grad=list(), start=list())
. Затем вы можете сделатьx[["grad"][[1]] <- ggplot(...)
или что-то еще. - person MrFlick   schedule 20.08.2016