r - 如何在R Shiny 中将数据从一个 `reactive()`传递到另一个?

标签 r shiny

一个 Shiny 的应用程序,它接受用户输入并将列名称发送到 selectizeInput()盒子。然后,用户选择几个列名称,并且将在同一应用程序的另一个部分/选项卡中创建数据子集。

应用程序的 UI 包含以下部分:

  1. 导航栏
  2. 导航栏的一个选项卡用于选择数据和列
  3. 用于创建数据子集和绘图的其他选项卡。

ui.R

 library(markdown)
require(XLConnect)


shinyUI(fluidPage(
  # Application title
  img(class = "img-polaroid",
      src = paste0(
      "http://www.aithent.com/wp-content/uploads/2015/05/aithent-website-200x80.png"
    )
  ),
  navbarPage(
    "Project Vanguard",
    tabPanel(
      "Table",
      titlePanel("Select Data"),
      sidebarLayout(
        sidebarPanel(
          selectInput(
            "fileType",
            "Select File Type:",
            c("MS Excel Worksheet (xls,xlsx)" = "xls",
              "Text/CSV (.csv)" = "csv")
          ),
          fileInput(
            'file1',
            'Choose file to upload',
            accept = c(
              'text/csv',
              'text/comma-separated-values',
              'text/tab-separated-values',
              'text/plain',
              '.csv',
              '.tsv',
              'application/vnd.ms-excel',
              'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
              '.xlsx',
              '.xls'
            )
          ),
          tags$hr(),
          checkboxInput('header', 'Header', TRUE),
          radioButtons('sep', 'Separator',
                       c(Comma = ',',
                         Semicolon = ';',
                         Tab = '\t'
                       ),','),
          radioButtons(
            'quote',
            'Quote',
            c(None = '',
              'Double Quote' = '"',
              'Single Quote' = "'"
              ),'"'
          ),
          tags$hr(),
          uiOutput("selector1"),
          uiOutput("selector2")
          ),
        mainPanel(dataTableOutput('table'))
      )),
    tabPanel("Plot",
             sidebarLayout(
               sidebarPanel(radioButtons(
                 "plotType", "Plot type",
                 c("Scatter" = "p", "Line" = "l"))),
               mainPanel(dataTableOutput("ResultTab"),
                         plotOutput("plot")))),
    navbarMenu("More",
               tabPanel(
                 "Summary",
                 verbatimTextOutput("summary"))))
))

服务器.R

library(sqldf)
options(scipen = 999)
shinyServer(function(input, output, session){
  output$plot <- renderPlot({
    plot(data$Count, data$Sales, type = input$plotType)
  })
  output$summary <- renderPrint({
    summary(data)
  })
  data <- reactive({
    inFile <- input$file1
    if (is.null(inFile))
      return(NULL)
    if (input$fileType == 'csv') {
      table1 <- read.csv(
        inFile$datapath,
        header = input$header,
        sep = input$sep,
        quote = input$quote
      )
      return(table1)
    } else if (input$fileType == 'xls') {
      table1 <- readWorksheetFromFile(inFile$datapath, sheet = 1)
    }
  })

  output$table <- renderDataTable({
    data()
  })

  output$selector1 <- renderUI({
    selectizeInput("GroupVar",
                   "Choose Group Variables:",
                   as.list(colnames(data())),
                   multiple = TRUE)
  })
  output$selector2 <- renderUI({
    selectizeInput("AnalysisVar",
                   "Choose Analysis Variables:",
                   as.list(colnames(data())),
                   multiple = TRUE)
  })

  ResultSet <- reactive({
    Src <- data()
    GVars <- as.character(input$selector1)
    Avars <- as.character(input$selector2)
    gvs <- paste(unlist(strsplit(GVars, ' ')), collapse = ",")
    avs <-
      paste0('sum(',
             strsplit(Avars, ' '),
             ') as SumOf',
             strsplit(Avars, ' '),
             collapse = ",")
    sqlStat <-
      paste0("SELECT ", gvs, ',', avs, " FROM Src GROUP BY ", gvs)
    Result <- sqldf(sqlStat)
    return(Result)
  })
  output$ResultTab <- renderDataTable({
    ResultSet()
  })
})

在代码中,我收到以下错误:

Error in sqliteSendQuery(con, statement, bind.data) : error in statement: near ",": syntax error

我想知道两件事我的 SQL 错误是因为: 1.数据传递不当,即响应式(Reactive)使用不正确ResultSet通过Src<-data() ? 或者 2.selectizeInput()的不当引用和使用通过声明GVars <- as.character(input$selector1)

最佳答案

要获取用户在selectize中选择的内容,您需要引用selectizeInputid。例如,您应该使用 input$GroupVar 而不是 input$selector1

您可以在 ResultSet 中添加 print(sqlStat) 以确保您的 SQL 语句正常。

响应式(Reactive)表达式也是闭包,要获取需要调用它们的值。例如,您的 renderPlot 应该是:

output$plot <- renderPlot({
         plot(data()$Count,data()$Sales, type=input$plotType)
      })

关于r - 如何在R Shiny 中将数据从一个 `reactive()`传递到另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34627343/

相关文章:

r - 如何指定R-shiny和shinyFiles保存文件的文件和路径?

用于过滤数据的 SQL 查询

R Plotly - 按标记的大小分配其颜色

r - 重新计算时避免数据表变灰

css - picketInput 更改占位符 R Shiny Widgets

r - 查找间隔(段)的成对重叠

从多个字符串的 grepl 匹配中返回匹配的字符串,而不是逻辑

r - ggplot2 facet wrap : y-axis scale on the first row only

r - R Shiny 仪表板中多个菜单项中 UIOutput 的使用

shiny - 在 selectinput 下拉列表中禁用一个项目