从html

时间:2018-05-18 08:25:57

标签: css r shiny plotly r-plotly

我希望能够做的是在html 中过滤后,根据(DT-)表的输出更新绘图。

例如 - 以下是html中为maz过滤的表格的屏幕截图:

enter image description here

我希望更新的散点图只显示已过滤表格中显示的值。

这可能吗?我知道我可以使用shiny web app来实现这样的功能,但是可以在html中嵌入一些闪亮的代码来实现这一目标吗? (我使用shiny / html的经验非常有限,所以对任何指针/想法都会感激不尽。)

我正在使用R-markdown(和here is a link to the html produced):

---
title: "Filter interative plots from table results"
date: "`r format(Sys.time(), '%B %e, %Y')`"
output:
  html_notebook:
    theme: flatly
    toc: yes
    toc_float: yes
    number_sections: true
    df_print: paged
  html_document: 
    theme: flatly
    toc: yes
    toc_float: yes
    number_sections: true
    df_print: paged
---

```{r setup, include=FALSE, cache=TRUE}
library(DT)
library(plotly)
library(stringr)
data(mtcars)
```


# Clean data
## Car names and models are now a string: "brand_model" in column 'car'

```{r include=FALSE}
mtcars$car <- rownames(mtcars)
mtcars$car <- stringr::str_replace(mtcars$car, ' ', '_')
rownames(mtcars) <- NULL
```

# Interactive table using DT

```{r rows.print=10}
DT::datatable(mtcars,
              filter = list(position = "top"),
              selection="none",                 #turn off row selection
              options = list(columnDefs = list(list(visible=FALSE, targets=2)),
                             searchHighlight=TRUE,
                             pagingType= "simple",
                             pageLength = 10,                  #default length of the above options
                             server = TRUE,                     #enable server side processing for better performance
                             processing = FALSE)) %>% 
              formatStyle(columns = 'qsec',
                background = styleColorBar(range(mtcars$qsec), 'lightblue'),
                backgroundSize = '98% 88%',
                backgroundRepeat = 'no-repeat',
                backgroundPosition = 'center')
```

# Plot disp against mpg using plotly

```{r fig.width=8, fig.height=8}
p <- plot_ly(data = mtcars,
             x = ~disp,
             y = ~mpg,
             type = 'scatter',
             mode = 'markers',
             text = ~paste("Car: ", car, "\n",
                           "Mpg: ", mpg, "\n"),
             color = ~mpg,
             colors = "Spectral",
             size = ~-disp
)
p
```

1 个答案:

答案 0 :(得分:1)

与我的第一次评估相反,它实际上是可能的。您的代码有多个新增功能。我会按时间顺序浏览它们:

  1. 您需要在yaml-header中添加runtime: shiny以在任何R-markdown文件中启动闪亮
  2. 可选:我添加了一些css样式,以防您需要调整闪亮的应用程序以适应特定的屏幕尺寸
  3. Shiny-documents包含UI部分,您可以在其中配置用户界面。通常您只需使用fluidPage函数
  4. 下一部分是server.r - 有趣的事情发生的部分:
    • 我们将您的DT::datatable分配给output - 对象(通常是列表)
    • 对于每项作业,我们需要设置shinyID我们在ui.r中配置然后添加,即output$mytable
    • 我添加了element,其中显示了选择哪些行进行调试
    • 所有变化的核心是input$mytable_rows_all。我们在ui.r中设置的所有控件都可以在render - 函数内调用。在此特定情况下,mytable指的是我为UI部分中的shinyID设置的DT::datatable,而rows_all告诉闪亮,以显示所显示的表格中的所有rownumbers。
    • 这样我们只需使用mtcars[input$mytable_rows_all,]
    • 对数据进行子集化
  5. 要学习闪亮,我建议Rstudio's tutorial。在学习并再次忘记所有内容后,我建议您使用wonderful cheatsheet provided by Rstudio

    整个修改后的代码如下所示:

    ---
    title: "Filter interative plots from table results"
    date: "`r format(Sys.time(), '%B %e, %Y')`"
    runtime: shiny
    output:
      html_document: 
        theme: flatly
        toc: yes
        toc_float: yes
        number_sections: true
        df_print: paged
      html_notebook:
        theme: flatly
        toc: yes
        toc_float: yes
        number_sections: true
        df_print: paged
    ---
    
    <style>
     body .main-container {
        max-width: 1600px !important;
        margin-left: auto;
        margin-right: auto;
      }
    </style>
    
    ```{r setup, include=FALSE, cache=TRUE}
    library(stringr)
    data(mtcars)
    ```
    
    
    # Clean data
    ## Car names and models are now a string: "brand_model" in column 'car'
    
    ```{r include=FALSE}
    mtcars$car <- rownames(mtcars)
    mtcars$car <- stringr::str_replace(mtcars$car, ' ', '_')
    rownames(mtcars) <- NULL
    ```
    
    
    
    # Plot disp against mpg using plotly
    
    ```{r}
    library(plotly)
    library(DT)
    
    ## ui.r
    motor_attributes=c('Cylinder(  shape): V4','Cylinder(  shape): V6','Cylinder(  shape): V8','Cylinder(  shape): 4,Straight Line','Cylinder(  shape): 6,Straight Line','Cylinder(  shape): 8,Straight Line','Transmission: manual','Transmission: automatic')
    
    fluidPage(# selectizeInput('cyl','Motor characteristics:',motor_attributes,multiple=TRUE,width='600px'),
              downloadLink('downloadData', 'Download'),
              DT::dataTableOutput('mytable'),
              plotlyOutput("myscatter"),
              htmlOutput('Selected_ids'))
    
    
    ### server.r
    output$mytable<-DT::renderDataTable({
      DT::datatable(mtcars,
                  filter = list(position = "top"),
                  selection='none', #list(target='row',selected=1:nrow(mtcars)),                 #turn off row selection
                  options = list(columnDefs = list(list(visible=FALSE, targets=2)),
                                 searchHighlight=TRUE,
                                 pagingType= "simple",
                                 pageLength = 10,                  #default length of the above options
                                 server = TRUE,                     #enable server side processing for better performance
                              processing = FALSE))   %>% 
                  formatStyle(columns = 'qsec',
                    background = styleColorBar(range(mtcars$qsec), 'lightblue'),
                    backgroundSize = '98% 88%',
                    backgroundRepeat = 'no-repeat',
                    backgroundPosition = 'center')
    })
    
    
    output$Selected_ids<-renderText({
      if(length(input$mytable_rows_all)<1){
          return()
      }
    
      selected_rows<-as.numeric(input$mytable_rows_all)  
      paste('<b> #Cars Selected: </b>',length(selected_rows),'</br> <b> Cars Selected: </b>',
            paste(paste('<li>',rownames(mtcars)[selected_rows],'</li>'),collapse = ' '))
    
    })
    
    output$myscatter<-renderPlotly({
      selected_rows<-as.numeric(input$mytable_rows_all)  
      subdata<-mtcars[selected_rows,]
      p <- plot_ly(data = subdata,
                 x = ~disp,
                 y = ~mpg,
                 type = 'scatter',
                 mode = 'markers',
                 text = ~paste("Car: ", car, "\n",
                               "Mpg: ", mpg, "\n"),
                 color = ~mpg,
                 colors = "Spectral",
                 size = ~-disp
    )
    p
    })
    ```