我有一个Shiny应用程序,允许用户上传CSV以进行情绪分析。
我想使用Shiny上传CSV,然后使用单独的功能(CapSent)进行分析并输出结果。
基本上我正试图通过' df'用户上传到功能“CapSent”中。 (来自全球.R)来自Shiny。 CapSent使用自定义单词词典进行情感分析。
到目前为止,我有:
UI:
library(shiny)
source('global.R')
ui <- fluidPage(
sidebarPanel(
# Input: Select a file ----
fileInput("file1", "Choose CSV File",
multiple = TRUE,
accept = c("text/csv",
"text/comma-separated-values,text/plain",
".csv"))
))
服务器:
server <- function(input, output) {
output$contents <- renderTable({
req(input$file1)
df <- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote)
CapSent(0.1, df) # 0.1 represents a threashold, df is the data
})
}
shinyApp(ui, server)
Functions.R:
CapSent <- function(0.1, df){
newdf<-data.frame(df,stringsAsFactors = FALSE)
#....Do some sentiment analysis here on newdf
#....Then export the sentiment analysis results
write.csv(newdf,"myResults.csv")
}
使用上面的代码,我收到错误&#39;编码错误&lt; - :预期的字符向量参数&#39;。
&#39; CapSent&#39;当我手动添加&#39; df&#39;到全球环境(使用readr),但我希望用户上传自己的数据进行分析。因此问题是:
非常感谢任何建议。
答案 0 :(得分:1)
试试这个:
ui.R
library(shiny)
# Define UI for app that draws a histogram ----
ui <- fluidPage(
# App title ----
titlePanel("Hello Shiny!"),
# Sidebar layout with input and output definitions ----
sidebarLayout(
# Sidebar panel for inputs ----
sidebarPanel(
# Input: ----
fileInput("file1", "Choose CSV File",
multiple = TRUE,
accept = c("text/csv",
"text/comma-separated-values,text/plain",
".csv")),
actionButton("button", "Apply function/download df"),
hr(),
uiOutput("downloadButton")
),
# Main panel for displaying outputs ----
mainPanel(
h2("ORIGINAL DATA FRAME"),
DT::dataTableOutput("contents"),
br(),
uiOutput("modify")
)
)
)
server.R
server <- function(input, output) {
temp_df <- reactiveValues(df_data = NULL)
temp_df2 <- reactiveValues(df_data = NULL)
output$contents <- DT::renderDataTable({
req(input$file1)
temp_df$df_data <- read.csv(input$file1$datapath, sep = ";")
temp_df$df_data
}, options = (list(pageLength = 5, scrollX = TRUE)))
output$contents2 <- DT::renderDataTable({
temp_df2$df_data
}, options = (list(pageLength = 5, scrollX = TRUE)))
observeEvent(input$button,{
if(!is.null(temp_df$df_data)){
temp_df2$df_data <- CapSent(temp = 0.7, temp_df$df_data)
output$modify <- renderUI({
tagList(
h2("MODIFY DATA FRAME"),
DT::dataTableOutput("contents2")
)
})
output$downloadButton <- renderUI({
downloadButton("downloadData", "Download")
})
}else{
showNotification("No data was upload")
}
})
output$downloadData <- downloadHandler(
filename = function() {
paste("data-", Sys.Date(), ".csv", sep="")
},
content = function(file) {
write.csv(temp_df2$df_data, file)
})
}
因为我不知道哪个CapSent
最终用途CapSent
是一个在原始数据框中添加新列的函数;
global.R
CapSent <- function(temp = 0.1, df){
newdf <- df
newdf$New_Col <- temp
return(newdf)
#....Do some sentiment analysis here on newdf
#....Then export the sentiment analysis results
#write.csv(newdf,"myResults.csv")
}
答案 1 :(得分:0)
如果你想创建一个全局函数/变量,只需创建一个global.R,它允许你在ui.R或server.R上的任何地方使用函数/变量。
这是了解详情的链接:https://shiny.rstudio.com/articles/scoping.html
编辑:如果要显示CSV,首先需要创建一个tabpanel,然后使用csv数据制作表格,如:
使用软件包DT,install.packages(“DT),是一个用于生成动态表的软件包。
`output$yourtabpanelid = DT::renderDataTable({
req(input$file1)
df <- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote)
return(df)
})`
然后不要创建函数.R,只需将函数放在一个函数之前,然后将read.csv(.....)放在函数之前,在server.R的所有函数中使用它,如:
`df <- read.csv(input$file1$datapath,
header = input$header,
sep = input$sep,
quote = input$quote
) server&lt; - function(输入,输出,会话){`
你可以退出函数DT的df&lt; - read.csv ....但保留return(df)