簡體   English   中英

如何下載沒有 html 標簽的 shiny 應用程序上生成的表格?

[英]how to download tables generated on shiny app without html tags?

我有一個 shiny 應用程序,其中輸出是使用 tableby() 和 kbl() 生成的一些表。 我終於找到了將這些表格作為表格下載到 excel 文件上的方法,但后來我想刪除仍然存在的 html 標簽。 我認為為此目的將 function 應用到列表中會弄亂 the.xlsx 上的列名,現在看起來很奇怪。 我嘗試使用unname()來修復它,但它並沒有改變任何東西。 有沒有辦法解決這個問題,或者 go 圍繞下載“干凈”版本的表格? 任何幫助將非常感激!

這是代碼:

library(shiny)
library(tidyverse)
library(readxl)
library(arsenal)
library(kableExtra)

ui <- fluidPage(
  titlePanel("(in true app, user uploads the data)"),
  sidebarLayout(
    sidebarPanel(
      downloadButton(
        outputId = "downloadTable",
        label = "Descargar tabla"
      )
    ),
    mainPanel(
      tabsetPanel(
        type = "tabs",
        tabPanel(
          "Tabla 1",
          htmlOutput("table")
        ),
        tabPanel(
          "Tabla 2",
          htmlOutput("table2")
      )
    )
  )
)
)

server <- function(input, output, session) {
  
  ID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
  Provincia <- c("Santa Fe", "Santa Fe", "Cordoba", "Santa Fe", "Santa Fe", "Cordoba", "Cordoba", "Santa Fe", "Cordoba", "Cordoba", "Santa Fe", "Santa Fe", "Santa Fe", "Santa Fe", "Santa Fe", "Cordoba", "Cordoba", "Cordoba", "Santa Fe")
  Ciudad <- c("Carlos Paz", "Esperanza", "Rafaela", "Carlos Paz", "Carlos Paz", "Rafaela", "Villa General", "Belgrano", "Villa General Belgrano", "Rafaela", "Esperanza", "Rafaela", "Esperanza", "Esperanza", "Villa General", "Belgrano", "Carlos Paz", "Carlos Paz", "Esperanza")
  Valor1 <- rpois(n = 19, lambda = 10)
  Valor2 <- runif(n = 19, min = 1, max = 10)
  Color <- c("Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo")
  df <- data.frame(ID, Provincia, Ciudad, Valor1, Valor2, Color)
  
  
  base <- reactive({
    df
  })

  controles <- reactive({
    tableby.control(
      test = T,
      total = T,
      numeric.test = "anova", cat.test = "chisq",
      numeric.stats = c("meanCI"),
      cat.stats = c("countpct"),
      stats.labels = list(
        meanCI = "Media (95%CI)",
        countpct = "n (%)"
      )
    )
  })
  
  tabla1 <- reactive({
    x <- base()
    
    my_controls <- controles()
    
    tab1 <- tableby(Color ~ Valor1+Valor2,
                    data=x,
                    control=my_controls)
    
    as.data.frame(summary(tab1,digits=1, text = "html"))
    
  })
  
  output$table <- function(){
    
    kable(tabla1(),align = "lccccc", escape = FALSE)%>%
      kable_styling(bootstrap_options = c("striped", "hover","condensed","responsive"), full_width = TRUE)
    }
  
  tabla2 <- reactive({
    
    x <- base()
    
    my_controls <- controles()
    
    tab2 <- tableby(Provincia ~ Valor1+Valor2,
                    data=x,
                    control=my_controls)
    as.data.frame(summary(tab2,digits=1, text = "html"))
  })
  
  output$table2 <- function(){
    
    kable(tabla2(),align = "lccccc", escape = FALSE)%>%
      kable_styling(bootstrap_options = c("striped", "hover","condensed","responsive"), full_width = TRUE)
  }

  data_list <- reactive({
    lista <- list(
      tabla1(),
      tabla2()
    )
    
    lapply(rapply(lista, function(x)
      gsub("<strong>|</strong>|&nbsp;&nbsp;&nbsp;", "", x), how = "list"),
      as.data.frame)
  })
  
  output$downloadTable <- downloadHandler(
    filename = function() {"prueba1.xlsx"},
    content = function(file) {write_xlsx(data_list(), path = file)}
  )
}

我們可以使用str_remove_all來刪除不需要的 HTML。 因為我們有一個列表,而我們要編輯的列沒有任何名稱,所以最后有點令人費解。

讓我們將data_list反應式更改為:

data_list <- reactive({
    lista <- list(
      tabla1(),
      tabla2()
    )

    map(lista, ~ {
      .x[[1]] %>%
        str_remove_all("<strong>|</strong>") %>%
        str_remove_all("&nbsp;") %>%
        cbind(.x[, -1]) %>%
        set_names(c("", names(.x)[-1]))
    })
  })

更簡單的手動方法:

 data_list <- reactive({
    lista <- list(
      tabla1(),
      tabla2()
    )

    lista[[1]][[1]] <- lista[[1]][[1]] %>%
      str_remove_all("<strong>|</strong>") %>%
      str_remove_all("&nbsp;")
    lista[[2]][[1]] <- lista[[2]][[1]] %>%
      str_remove_all("<strong>|</strong>") %>%
      str_remove_all("&nbsp;")

    lista
  })

應用程序:

library(shiny)
library(readxl)
library(arsenal)
library(kableExtra)
library(writexl)
library(tidyverse)

ui <- fluidPage(
  titlePanel("(in true app, user uploads the data)"),
  sidebarLayout(
    sidebarPanel(
      downloadButton(
        outputId = "downloadTable",
        label = "Descargar tabla"
      )
    ),
    mainPanel(
      tabsetPanel(
        type = "tabs",
        tabPanel(
          "Tabla 1",
          htmlOutput("table")
        ),
        tabPanel(
          "Tabla 2",
          htmlOutput("table2")
        )
      )
    )
  )
)

server <- function(input, output, session) {
  ID <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
  Provincia <- c("Santa Fe", "Santa Fe", "Cordoba", "Santa Fe", "Santa Fe", "Cordoba", "Cordoba", "Santa Fe", "Cordoba", "Cordoba", "Santa Fe", "Santa Fe", "Santa Fe", "Santa Fe", "Santa Fe", "Cordoba", "Cordoba", "Cordoba", "Santa Fe")
  Ciudad <- c("Carlos Paz", "Esperanza", "Rafaela", "Carlos Paz", "Carlos Paz", "Rafaela", "Villa General", "Belgrano", "Villa General Belgrano", "Rafaela", "Esperanza", "Rafaela", "Esperanza", "Esperanza", "Villa General", "Belgrano", "Carlos Paz", "Carlos Paz", "Esperanza")
  Valor1 <- rpois(n = 19, lambda = 10)
  Valor2 <- runif(n = 19, min = 1, max = 10)
  Color <- c("Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo", "Azul", "Rojo")
  df <- data.frame(ID, Provincia, Ciudad, Valor1, Valor2, Color)


  base <- reactive({
    df
  })

  controles <- reactive({
    tableby.control(
      test = T,
      total = T,
      numeric.test = "anova", cat.test = "chisq",
      numeric.stats = c("meanCI"),
      cat.stats = c("countpct"),
      stats.labels = list(
        meanCI = "Media (95%CI)",
        countpct = "n (%)"
      )
    )
  })

  tabla1 <- reactive({
    x <- base()

    my_controls <- controles()

    tab1 <- tableby(Color ~ Valor1 + Valor2,
      data = x,
      control = my_controls
    )

    as.data.frame(summary(tab1, digits = 1, text = "html"))
  })

  output$table <- function() {
    kable(tabla1(), align = "lccccc", escape = FALSE) %>%
      kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE)
  }

  tabla2 <- reactive({
    x <- base()

    my_controls <- controles()

    tab2 <- tableby(Provincia ~ Valor1 + Valor2,
      data = x,
      control = my_controls
    )
    as.data.frame(summary(tab2, digits = 1, text = "html"))
  })

  output$table2 <- function() {
    kable(tabla2(), align = "lccccc", escape = FALSE) %>%
      kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"), full_width = TRUE)
  }

  data_list <- reactive({
    lista <- list(
      tabla1(),
      tabla2()
    )

    map(lista, ~ {
      .x[[1]] %>%
        str_remove_all("<strong>|</strong>") %>%
        str_remove_all("&nbsp;") %>%
        cbind(.x[, -1]) %>%
        set_names(c("", names(.x)[-1]))
    })
  })

  output$downloadTable <- downloadHandler(
    filename = function() {
      "prueba1.xlsx"
    },
    content = function(file) {
      write_xlsx(data_list(), path = file)
    }
  )
}

shinyApp(ui, server)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM