2016-08-20 7 views
0

Я пытаюсь назначить график списку, названному через переменную (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"]]) 
+0

«Хороший» R-код не использует 'assign()'. Я предлагаю вам как можно скорее нарушить свою привычку. – MrFlick

+0

Спасибо @MrFlick. Как мне назначить переменную? Я попробовал eval (snm) <- но это не сработало. – atclaus

+0

Не используйте 'eval()' либо. Обычно вам просто нужно использовать имена именованных списков. Это то, что большинство функций предназначены для работы лучше всего, а не из нескольких отдельных переменных. Если вам нужны две коллекции, одна для «grad» и «start», используйте 'x <- list (grad = list(), start = list())'. Затем вы можете сделать 'x [[" grad "] [[1]] <- ggplot (...)' или whateer. – MrFlick

ответ

1

Несмотря на длительный фрагмент кода, ваш вопрос на самом деле не ясно. Вы пытаетесь сделать что-то подобное?

library(ggplot2) 
library(gridExtra) 

set.seed(1492) 
TDSF <- data.frame(Graduation=sample(1950:2010, 30), 
        Donation=sample(300:10000, 30)) 

snm <- mapply(function(x, title) { 
    ggplot(TDSF, aes_(x=as.name(x))) + 
    geom_histogram() + 
    labs(title=title) 
}, c("Graduation", "Donation"), c("A", "B"), SIMPLIFY=FALSE) 

do.call(grid.arrange, snm) 
+0

Извините. Новое в R и переполнение стека (по крайней мере, проводка). Это совершенно другой подход, чем я делал, но может работать лучше. Тем не менее, я пытаюсь назвать что-то для snm, но пусть snm изменится. Итак, я закончил с grad [[1]], grad [[[2]], а затем init [[1]], init [[2]] – atclaus

+0

Переработал мой OP, чтобы надеяться сделать больше смысла – atclaus

+0

Решил. Я не был знаком с ** aes _ ** и просто ** aes ** и пропустил его в вашем примере – atclaus

0

То, что я хотел сделать изначально, невозможно в этом точном порядке. Однако на основе обратной связи мне удалось создать список списков ggplots. Это конденсирует меня до 1 переменной по сравнению с 2, на которые я нацелился. Вместо start[[1]] для построения первого графика я использую plot[["start"]][[1]]. Имеет смысл, когда вы читаете его, но не так, как я ожидал. Я родом из VBA и python, поэтому R - новый формат.

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)) 

    plot<-mapply(function(snm,nm) list(
     {ggplot(data=TDSF, aes_q(x=as.name(nm)))+geom_histogram()+labs(title=paste("Number of People per",snm,"Year"))}, 
     {ggplot(data=TDSF, aes_q(x=as.name(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"]])