如何在 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 应用程序中嵌入清洁代码?的主要内容,如果未能解决你的问题,请参考以下文章
将 instagram/youtube 嵌入到 Shiny R 应用程序中