如何在 R Shiny 应用程序中嵌入清洁代码?

Posted

技术标签:

【中文标题】如何在 R Shiny 应用程序中嵌入清洁代码?【英文标题】:How to embed cleaning code in an R Shiny app? 【发布时间】:2022-01-02 04:31:22 【问题描述】:

我在图书馆工作,我们在 csv 中获得常规数据库输出,其中包含期刊文章信息(标题、作者、摘要等)。它有 67 列,并且列名每次都相同。每行都有不同期刊文章的引文信息。目标是在一个列中创建一个完整引用的电子表格(通过将不同的列粘贴在一起,如作者和出版日期)和在另一列中的开放获取状态,并删除无关的列。我编写了一些 R 代码,它会自动删除不必要的列并将其余列粘贴在一起,当我是唯一一个清理人员时,它工作得很好。然而,我的主管希望办公室里的其他人能够执行这项工作,并要求我制作一个 R Shiny 应用程序来做到这一点。我以前从未创建过。虽然我已经设法为脚本的上传和下载部分编写代码,但我实际上无法让清理部分工作。第一段代码是我已经在应用程序之外进行的清理工作。

library(tidyverse)
#data is the name of the csv after I load it
datasubset= subset(data, select = c(Author.Full.Names,Article.Title,Source.Title,Volume,Issue,Article.Number,DOI,Publication.Date,Publication.Year,Open.Access.Designations))
datasubset$Full.Date <- paste(datasubset$Publication.Date, datasubset$Publication.Year)
datasubset$Citation <- paste("Author(s): ",datasubset$Author.Full.Names,". Title:",datasubset$Article.Title,". Volume:",datasubset$Volume,". Issue:",datasubset$Issue,". Article Number:",datasubset$Article.Number,". DOI:",datasubset$DOI,". Published:",datasubset$Full.Date)
citationdata= subset(datasubset, select=c(Citation,Open.Access.Designations))

这就是我目前所拥有的 Shiny 应用程序。我尝试从几个不同的教程(包括此处的其他问题)中以多种方式放置清理代码部分,但我不太明白。

library(tidyverse)
library(shiny)

ui <- fluidPage(
  fluidPage(
    titlePanel("Uploading Files"),
    sidebarLayout(
      sidebarPanel(
        fileInput('data', 'Choose CSV File',
                  accept=c('text/csv', 
                           'text/comma-separated-values,text/plain', 
                           '.csv')),
        tags$hr(),
        checkboxInput('header', 'Header', TRUE),
        radioButtons('sep', 'Separator',
                     c(Comma=',',
                       Semicolon=';',
                       Tab='\t'),
                     ','),
        radioButtons('quote', 'Quote',
                     c(None='',
                       'Double Quote'='"',
                       'Single Quote'="'"),
                     '"'),
        downloadButton('downloadData', 'Download')
      ),
      mainPanel(
        tableOutput('contents')
      )
    )
  )
)
server <- function(input, output) 
  
  getData <- reactive(
    
    inFile <- input$data
    
    if (is.null(input$data))
      return(NULL)
    
    read.csv(inFile$datapath, header=input$header, sep=input$sep, 
             quote=input$quote)
  
  )
  output$contents <- renderTable(
    
    getData()
    
  )
  
  
  output$downloadData <- downloadHandler(
    
    filename = function()  
      paste("data-", Sys.Date(), ".csv", sep="")
    ,
    
    content = function(file) 
      
      write.csv(getData(), file)
      
    )
  

shinyApp(ui, server)

如果有人能指出如何将两者合并在一起,我将不胜感激。理想情况下,有人可以将他们从数据库下载的 csv 文件上传到应用程序,应用程序会对其进行清理,然后他们可以下载清理后的版本,该版本只有两列——引用和开放访问状态。另外,这是我在这里的第一篇文章,所以如果我遗漏了任何相关内容,请告诉我!谢谢!

【问题讨论】:

为了澄清图书管理员小姐,您有一个tableOutput,您是否希望清洁功能在它显示在桌子上之前发生?还是表格显示原始数据,然后只有你说下载后才会清理数据?无论哪种方式,你都有一个非常好的开始。 同意 Silent - 对于以前没有制作 Shiny 应用程序的人来说,这是一个非常好的开始。添加清理代码的最佳位置是在 getData 函数中 - 您可以将 read.csv 的输出保存到名为 data 的变量中,然后在接下来的几行中逐字复制并粘贴清理代码。 谢谢静默!那行得通!显然我想多了——我感谢你和 Dubukay 的清晰解释和有用的干净代码副本。总而言之,表格中显示哪个版本的数据并不重要,所以这非常适合我的需要(并且似乎也是最直接的方式)。现在我也知道将来该怎么做! 【参考方案1】:

我认为你在这方面真的很接近。我在评论中问了一个问题,但我猜您希望在数据显示在表格上之前对其进行清理。基本上你需要做的就是将你的“清理代码”放入reactive。我将 read.csv 放入一个名为“data”的新变量中以适应您的清理功能,然后在其后放置一个最终输出“citationdata”。希望这是您正在寻找的:

library(tidyverse)
library(shiny)

ui <- fluidPage(
  fluidPage(
    titlePanel("Uploading Files"),
    sidebarLayout(
      sidebarPanel(
        fileInput('data', 'Choose CSV File',
                  accept=c('text/csv', 
                           'text/comma-separated-values,text/plain', 
                           '.csv')),
        tags$hr(),
        checkboxInput('header', 'Header', TRUE),
        radioButtons('sep', 'Separator',
                     c(Comma=',',
                       Semicolon=';',
                       Tab='\t'),
                     ','),
        radioButtons('quote', 'Quote',
                     c(None='',
                       'Double Quote'='"',
                       'Single Quote'="'"),
                     '"'),
        downloadButton('downloadData', 'Download')
      ),
      mainPanel(
        tableOutput('contents')
      )
    )
  )
)
server <- function(input, output) 
  
  getData <- reactive(
    
    inFile <- input$data
    
    if (is.null(input$data))
      return(NULL)
    
    data<-read.csv(inFile$datapath, header=input$header, sep=input$sep, 
             quote=input$quote)

    # #data is the name of the csv after I load it
    datasubset= subset(data, select = c(Author.Full.Names,Article.Title,Source.Title,Volume,Issue,Article.Number,DOI,Publication.Date,Publication.Year,Open.Access.Designations))
    datasubset$Full.Date <- paste(datasubset$Publication.Date, datasubset$Publication.Year)
    datasubset$Citation <- paste("Author(s): ",datasubset$Author.Full.Names,". Title:",datasubset$Article.Title,". Volume:",datasubset$Volume,". Issue:",datasubset$Issue,". Article Number:",datasubset$Article.Number,". DOI:",datasubset$DOI,". Published:",datasubset$Full.Date)
    citationdata = subset(datasubset, select=c(Citation,Open.Access.Designations))
    citationdata
    
  )
  output$contents <- renderTable(
    
    getData()
    
  )
  
  
  output$downloadData <- downloadHandler(
    
    filename = function()  
      paste("data-", Sys.Date(), ".csv", sep="")
    ,
    
    content = function(file) 
      
      write.csv(getData(), file)
      
    )
  

shinyApp(ui, server)

【讨论】:

以上是关于如何在 R Shiny 应用程序中嵌入清洁代码?的主要内容,如果未能解决你的问题,请参考以下文章

检索嵌入在 R Shiny 应用程序中的视频播放时间

图像未在 Shiny 应用 R 中显示

将 instagram/youtube 嵌入到 Shiny R 应用程序中

在 R Shiny App 中,如何在首次调用 App 时呈现默认表格?

「R」Shiny:响应式编程server 函数

在Rmarkdown文档中调整嵌入式Shiny App的大小