【问题标题】:How to embed cleaning code in an R Shiny app?如何在 R Shiny 应用程序中嵌入清洁代码?
【发布时间】: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 的清晰解释和有用的干净代码副本。总而言之,表格中显示哪个版本的数据并不重要,所以这非常适合我的需要(并且似乎也是最直接的方式)。现在我也知道将来该怎么做!

标签: r csv shiny


【解决方案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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2018-01-03
    • 2017-05-21
    • 2017-09-30
    • 2015-04-12
    • 2018-09-23
    相关资源
    最近更新 更多