从闪亮的

时间:2018-03-23 07:48:32

标签: r shiny

我有一个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),但我希望用户上传自己的数据进行分析。因此问题是:

有没有办法将df从Shiny传递给全球环境?

非常感谢任何建议。

2 个答案:

答案 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)