Я пытаюсь назначить график списку, названному через переменную (snm). Мой фрагмент кода - это все варианты, которые я пытался сделать, чтобы он работал. Какой еще вариант мне не хватает? Благодарю.R - Присвоение графика переменному именованному списку
Моя цель состоит в том, чтобы перевернуть мои назначения графиков, используя оператор 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"]])
mapply попытка:
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"]])
«Хороший» R-код не использует 'assign()'. Я предлагаю вам как можно скорее нарушить свою привычку. – MrFlick
Спасибо @MrFlick. Как мне назначить переменную? Я попробовал eval (snm) <- но это не сработало. – atclaus
Не используйте 'eval()' либо. Обычно вам просто нужно использовать имена именованных списков. Это то, что большинство функций предназначены для работы лучше всего, а не из нескольких отдельных переменных. Если вам нужны две коллекции, одна для «grad» и «start», используйте 'x <- list (grad = list(), start = list())'. Затем вы можете сделать 'x [[" grad "] [[1]] <- ggplot (...)' или whateer. – MrFlick