R 闪亮,上传文件 doc/PDF 和 运行 函数,输出问题
R shiny, upload word doc/PDF and run function on uploaded document, Output issues
这是我第一次使用和探索 R shiny。这个过程看起来非常简单,但我在将所有内容顺利 运行 时遇到了一些困难。
我正在尝试构建一个允许用户上传 word 文档、PDF 或其他文本文件的应用程序(如果还有直接粘贴文本而不是上传文件的选项会很棒),然后一个函数将 运行 放在文件或粘贴的文本上,这将导致 returned 文本列表。
我的代码在不使用 R shiny 时工作正常:
library(dplyr)
library(stringr)
library(readtext)
library(XML)
library(here)
### option to manually paste in text to use instead of uploading file:
text <- "This is a test. The purpose of the below function is to extract and return and in-text cictations with the following formats:(Smith, 2010), and (Smith 2010; Jones, 2001; Brown 2020), or Cooper (2015), or John Granger et al. (2015), and (Brown and Green 2004)."
######Option to read in word doc######
wordtest<-readtext(here("Example.docx"))
text<-wordtest$text
######Option to read in PDF file######
PDFtest<-readtext("Example2.pdf")
text<-PDFtest$text
##Return citations alphabetically:
rx <- "(?:\b(\p{Lu}\w*(?:\s+\p{Lu}\w*)*(?:\s+et\s+al\.)?)?)\s*\(([^()]*\d{4})\)"
res <- str_match_all(text, rx)
result <- lapply(res, function(z) {ifelse(!is.na(z[,2]) & str_detect(z[,3],"^\d+$"), paste(trimws(z[,2]), trimws(z[,3])), z[,3])})
sort(unique(unlist(sapply(result, function(z) strsplit(paste(z, collapse=";"), "\s*;\s*")))))
运行此代码的结果如下:
[1] "Brown 2020" "Brown and Green 2004" "Cooper 2015" "John Granger et al. 2015"
[5] "Jones, 2001" "Smith 2010"
我想 运行 在一个 R shiny 应用程序上 运行 具有相同功能的相同过程,用户可以上传包含此类文本的文件或直接粘贴文本,它会 return同样的结果。
这是我现在的应用程序:
# Load R packages
library(shiny)
library(shinythemes)
library(dplyr)
library(stringr)
library(readtext)
library(XML)
library(data.table)
# Define UI
ui <- fluidPage(theme = shinytheme("cerulean"),
navbarPage(
theme = "cerulean", # <--- To use a theme, uncomment this
"Extracting in-text citations app", #app title
tabPanel("Alphabetical Order", # tab title
sidebarPanel(
# Input: Select a file ----
fileInput(inputId ="text", "Choose File",
multiple = FALSE,
accept = c("text/plain",".doc",".docx",".pdf")),
p("Accepted Files: .doc, .docx, .pdf, text/plain"),
), # sidebarPanel
mainPanel(
h1("Output"),
h4("List of citations in Alphabetical Order"),
verbatimTextOutput("txtout"),
) # mainPanel
), # Navbar 1, tabPanel
tabPanel("Chronological Order", "This panel is intentionally left blank"),
) # navbarPage
) # fluidPage
#Define Server:
server<- function (input,output){
output$txtout<-renderPrint({
wordtest<-readtext(input$text)
text2<-wordtest$text
rx <- "(?:\b(\p{Lu}\w*(?:\s+\p{Lu}\w*)*(?:\s+et\s+al\.)?)?)\s*\(([^()]*\d{4})\)"
res <- str_match_all(text2, rx)
result <- lapply(res, function(z) {ifelse(!is.na(z[,2]) & str_detect(z[,3],"^\d+$"), paste(trimws(z[,2]), trimws(z[,3])), z[,3])})
return(sort(unique(unlist(sapply(result, function(z) strsplit(paste(z, collapse=";"), "\s*;\s*"))))))
})
}
# Create Shiny object
shinyApp(ui = ui, server = server)
我可以让应用程序运行(打开),但是当我去上传文件时,没有任何反应,或者我得到以下错误:“文件必须是一个字符(指定文件位置( s))."
正如我所说,我对 R shiny 很陌生,所以任何见解都会有所帮助,谢谢!
fileInput
不直接 return filename/path。
它 return 是一个包含 name
、size
、type
和 datapath
的数据帧。
您可能想要的是 datapath
,所以试试这个。
file <- input$text
wordtest<-readtext(file$datapath)
这是我第一次使用和探索 R shiny。这个过程看起来非常简单,但我在将所有内容顺利 运行 时遇到了一些困难。
我正在尝试构建一个允许用户上传 word 文档、PDF 或其他文本文件的应用程序(如果还有直接粘贴文本而不是上传文件的选项会很棒),然后一个函数将 运行 放在文件或粘贴的文本上,这将导致 returned 文本列表。
我的代码在不使用 R shiny 时工作正常:
library(dplyr)
library(stringr)
library(readtext)
library(XML)
library(here)
### option to manually paste in text to use instead of uploading file:
text <- "This is a test. The purpose of the below function is to extract and return and in-text cictations with the following formats:(Smith, 2010), and (Smith 2010; Jones, 2001; Brown 2020), or Cooper (2015), or John Granger et al. (2015), and (Brown and Green 2004)."
######Option to read in word doc######
wordtest<-readtext(here("Example.docx"))
text<-wordtest$text
######Option to read in PDF file######
PDFtest<-readtext("Example2.pdf")
text<-PDFtest$text
##Return citations alphabetically:
rx <- "(?:\b(\p{Lu}\w*(?:\s+\p{Lu}\w*)*(?:\s+et\s+al\.)?)?)\s*\(([^()]*\d{4})\)"
res <- str_match_all(text, rx)
result <- lapply(res, function(z) {ifelse(!is.na(z[,2]) & str_detect(z[,3],"^\d+$"), paste(trimws(z[,2]), trimws(z[,3])), z[,3])})
sort(unique(unlist(sapply(result, function(z) strsplit(paste(z, collapse=";"), "\s*;\s*")))))
运行此代码的结果如下:
[1] "Brown 2020" "Brown and Green 2004" "Cooper 2015" "John Granger et al. 2015"
[5] "Jones, 2001" "Smith 2010"
我想 运行 在一个 R shiny 应用程序上 运行 具有相同功能的相同过程,用户可以上传包含此类文本的文件或直接粘贴文本,它会 return同样的结果。
这是我现在的应用程序:
# Load R packages
library(shiny)
library(shinythemes)
library(dplyr)
library(stringr)
library(readtext)
library(XML)
library(data.table)
# Define UI
ui <- fluidPage(theme = shinytheme("cerulean"),
navbarPage(
theme = "cerulean", # <--- To use a theme, uncomment this
"Extracting in-text citations app", #app title
tabPanel("Alphabetical Order", # tab title
sidebarPanel(
# Input: Select a file ----
fileInput(inputId ="text", "Choose File",
multiple = FALSE,
accept = c("text/plain",".doc",".docx",".pdf")),
p("Accepted Files: .doc, .docx, .pdf, text/plain"),
), # sidebarPanel
mainPanel(
h1("Output"),
h4("List of citations in Alphabetical Order"),
verbatimTextOutput("txtout"),
) # mainPanel
), # Navbar 1, tabPanel
tabPanel("Chronological Order", "This panel is intentionally left blank"),
) # navbarPage
) # fluidPage
#Define Server:
server<- function (input,output){
output$txtout<-renderPrint({
wordtest<-readtext(input$text)
text2<-wordtest$text
rx <- "(?:\b(\p{Lu}\w*(?:\s+\p{Lu}\w*)*(?:\s+et\s+al\.)?)?)\s*\(([^()]*\d{4})\)"
res <- str_match_all(text2, rx)
result <- lapply(res, function(z) {ifelse(!is.na(z[,2]) & str_detect(z[,3],"^\d+$"), paste(trimws(z[,2]), trimws(z[,3])), z[,3])})
return(sort(unique(unlist(sapply(result, function(z) strsplit(paste(z, collapse=";"), "\s*;\s*"))))))
})
}
# Create Shiny object
shinyApp(ui = ui, server = server)
我可以让应用程序运行(打开),但是当我去上传文件时,没有任何反应,或者我得到以下错误:“文件必须是一个字符(指定文件位置( s))."
正如我所说,我对 R shiny 很陌生,所以任何见解都会有所帮助,谢谢!
fileInput
不直接 return filename/path。
它 return 是一个包含 name
、size
、type
和 datapath
的数据帧。
您可能想要的是 datapath
,所以试试这个。
file <- input$text
wordtest<-readtext(file$datapath)