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

3
我在图书馆工作,我们会定期从数据库中获取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文件,上传到应用程序进行清理,然后下载经过清理的版本,该版本仅包含两列-引文和开放访问状态。同时,这是我在这里的第一篇帖子,请告诉我是否遗漏了任何相关内容!谢谢!


1
为了澄清一下,Miss 图书管理员,您有一个tableOutput,您是希望在表格显示之前进行清洁处理吗?还是该表格显示原始数据,只有在您要求下载后才会清理数据?无论哪种方式,您都已经有了一个非常好的开端。 - Silentdevildoll
同Silent的意见一致 - 对于没有制作过Shiny应用程序的人来说,这是一个非常好的开始。添加清理代码的最佳位置应该在getData函数内部 - 您可以将read.csv的输出保存到名为data的变量中,然后直接复制并粘贴您的清理代码到下面几行。 - Dubukay
谢谢Silent!它起作用了!显然我想得太多了——我感激你和Dubukay清晰的解释和有用的干净代码。总的来说,在表格中显示哪个版本的数据并不重要,所以这对我需要的东西非常有效(而且似乎也是最直接的方法)。现在我也知道如何做了! - shannon_the_librarian
1个回答

1

我认为你离正确答案已经很接近了。我在评论中问了一个问题,但我猜你想在表格显示数据之前进行数据清洗。基本上,你只需要将你的"清洗代码"放入reactive即可。我将read.csv放入一个新的变量名"数据(data)"中以适应你的清洗函数,然后放置了最终输出"citationsdata"。希望这正是你要找的内容:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接