当调用lapply或for循环时,Plots不会在R markdown编码代码生成的html中迭代显示

时间:2017-03-29 05:07:39

标签: r plotly

我的数据框“ df ”看起来像这样

C1 C2 C3 C4   
AA 10 ab 9  
AA 11 ac 10  
AA 12 ae 11   
BB 10 ab 20  
BB 11 ab 30  
BB 12 ab 2  
CC 10 ax 20  
CC 12 ad 20  
DD 17 ae 23  

依旧...... 13000行。

在R Studio中,我能够以下列方式使用 C1 中的每个唯一值迭代地显示/生成单独的条形图:

abcd<-c('AA','BB','CC', 'DD')  
        ## when using all of the data frame I plan to do : abcd<-df$C1

        myfun<- function(j)
        {


          main<-paste("Printing  ", abcd[j],"  <br> (Hover for values) " )

          df %>%
            filter(C1==abcd[j])%>%
            select(C1,C2,C3,C4) %>%
            group_by(C1,C2,C3) %>%
            summarise(value=sum(C4))-> new_df


          p<-(plot_ly(new_df, x= ~C2, y = ~value, color = ~C3, type = "bar", alpha = 0.9) %>%
                layout(title = main, xaxis = list(title ="", yaxis = list(title = "Test Title")))%>% layout(barmode = "stack"))

          p
        }
        lapply(1:4, myfun)

我也可以使用for循环覆盖' abcd '来做同样的事情

这是我的Rmarkdown代码:

    ---
    title: 'Apple bees'
    author: "Krazzy R"
    date: "28 March 2017"
    output:
      html_document:
        highlight: pygments
        pdf_document: default
        theme: spacelab
      pdf_document: default
      word_document: default
    ---

    ```{r setup, include=FALSE}
    library(knitr)

    knitr::opts_chunk$set(tidy.opts=list(width.cutoff=120),tidy=TRUE,echo = TRUE)
    ```

    ```{r, include=TRUE,results='hide', message=FALSE, warning=FALSE, echo=TRUE}
    library(plyr)
    library(dplyr)
    library(ggplot2)
    library(readr)
    require(knitr)
    require(plotly)
    ```
    ```{r, echo= TRUE)
    df<- read.csv("my_csv.csv")

    abcd<-c('AA','BB','CC', 'DD')  
        ## when using all of the data frame I plan to do : abcd<-df$C1

        myfun<- function(j)
        {
          main<-paste("Printing  ", abcd[j],"  <br> (Hover for values) " )

          df %>%
            filter(C1==abcd[j])%>%
            select(C1,C2,C3,C4) %>%
            group_by(C1,C2,C3) %>%
            summarise(value=sum(C4))-> new_df


          p<-(plot_ly(new_df, x= ~C2, y = ~value, color = ~C3, type = "bar", alpha = 0.9) %>%
                layout(title = main, xaxis = list(title ="", yaxis = list(title = "Test Title")))%>% layout(barmode = "stack"))

          p
        }

    ```

    ```{r, echo=TRUE}
    myfun(1)
    myfun(2)
    myfun(3)

    ```

当我明确地打电话给   myfun(1)
      myfun(2)等     这些图显示在编织的html中     但是我在 C1 中有200个唯一值,我想迭代地显示所有这些值。

所以我试过

1

      ```{r, echo=TRUE}
        lapply(1:4,myfun)

        ```

但这并没有显示任何情节。

然后我尝试了:
 2。

    ```{r, echo =TRUE}
    print(lapply(1:4, myfun))
    ```

仍然没有输出

因此
3.

    ```{r, echo =TRUE}
    for(i in 1:4){
    (myfun(i))
    }
    ```

再次没有情节 4。 所以使用for循环

        ```{r, echo= TRUE} 
        abcd<-c('AA','BB','CC', 'DD')  
                ## when using all of the data frame I plan to do : abcd<-df$C1

                for(j in 1:4){

       main<-paste("Printing  ", abcd[j],"  <br> (Hover for values) " )

              df %>%
                filter(C1==abcd[j])%>%
                select(C1,C2,C3,C4) %>%
                group_by(C1,C2,C3) %>%
                summarise(value=sum(C4))-> new_df


              p<-(plot_ly(new_df, x= ~C2, y = ~value, color = ~C3, type = "bar", alpha = 0.9) %>%
                    layout(title = main, xaxis = list(title ="", yaxis = list(title = "Test Title")))%>% layout(barmode = "stack"))

              p 
    # no change when using print(p)

            }

    ```   

没有情节 但是,如果我将p移动到for循环外部,它只打印一个与循环的最后一个值对应的绘图。 我错过了什么?我该如何解决? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

Combiner返回一个列表,在编写文档时必须将其呈现为HTML 为此,您应该使用lapply()

htmltools::tagList()

请注意,如果呈现&#39;内联&#39;

,则返回空格