2017-12-16 11 views
0

여러 데이터 프레임에서 여러 ggplot 차트를 만들려고합니다. 아래 코드를 개발했지만 최종 루프가 작동하지 않습니다.목록 내의 데이터 프레임을 플롯 함수로 보내기

df1 <- tibble(
    a = rnorm(10), 
    b = rnorm(10) 
) 

df2 <- tibble(
    a = rnorm(20), 
    b = rnorm(20) 
) 

chart_it <- function(x) { 
    x %>% ggplot() + 
    geom_line(mapping = aes(y=a,x=b)) + 
    ggsave(paste0(substitute(x),".png")) 
} 

ll <- list(df1,df2) 

for (i in seq_along(ll)) { 
chart_it(ll[[i]]) 
} 

나는

ll[[i]] 

함께 할 수있는 그 무언가를 알고 있지만 나는 이유를 이해 해달라고 내가 콘솔에 내가 원하는 dataframe을 준다 넣으면 때문이다. 또한 for 루프가 아닌 map 함수를 사용하여 깔끔한 방식으로이 작업을 수행 할 수 있습니까?

답변

2

의 라인을 따라

뭔가.

어떻게 든 데이터 프레임의 이름을 함수에 전달해야합니다. 이를 수행하는 한 가지 방법은 이름이 지정된 목록을 통해 이루어지며 이름을 목록 요소의 내용과 함께 전달합니다.

library(ggplot2) 
library(purrr) 

df1 <- tibble(
    a = rnorm(10), 
    b = rnorm(10) 
) 

df2 <- tibble(
    a = rnorm(20), 
    b = rnorm(20) 
) 

chart_it <- function(x, nm) { 
    p <- x %>% ggplot() + 
    geom_line(mapping = aes(y=a,x=b)) 
    ggsave(paste0(nm,".png"), p, device = "png") 
} 

ll <- list(df1=df1,df2=df2) 

for (i in seq_along(ll)) { 
    chart_it(ll[[i]], names(ll[i])) 
} 

tidyverse에서는 함수를 수정하지 않고 루프를 다음 명령으로 바꿀 수 있습니다.

purrr::walk2(ll, names(ll),chart_it) 

하거나

purrr::iwalk(ll, chart_it) 

imaplmap있다, 그러나 당신이하고자하는 것이 아니다 콘솔에서 일부 출력을 떠날 것 같아요.

+0

그게 완벽합니다. 정말 고마워 :) – jimbo

0

문제는 chart_it 기능에 있습니다. ggplot을 반환하지 않습니다. 파이프의 결과를 변수에 저장하고 return() (또는 함수의 마지막 명령문으로 배치)을 시도하십시오. 난 당신이 마지막에 df1.pngdf2.png라는 두 개의 파일을 참조한다고 가정

chart_it <- function(x) { 
    chart <- x %>% ggplot() + 
    geom_line(mapping = aes(y=a,x=b)) 

    ggsave(paste0(substitute(x),".png")) # this will save the last ggplot figure 

    return(chart) 
} 
+0

답장을 보내 주셔서 감사합니다. 'chart_it (df1)'을 실행하면 플롯이 저장되므로 내 함수가 괜찮은 것 아닙니까? – jimbo

+0

시도한 다음 'chart_it <- 함수 (X) {X % > % ggplot() + geom_line (매핑 = AES (Y는, X = B를 =)) + ggsave을 (paste0 (대체 (X) ".png")) -> chart return (chart) } 그리고 "오류 :'device'는 NULL, 문자열 또는 함수 여야합니다." – jimbo

+0

업데이트 된 답변, @jimbo를 참조하십시오. –