如何将数据框架对象从renderUI传递到eventReactive?

时间:2018-10-27 23:38:55

标签: r dataframe shiny

我希望我清楚。我想知道如何在服务器功能中将用户输入的数据帧从renderUI传递到evenReactive。问题是在eventReactive中找不到ct。请指教!

我的代码如下:

 public static char hashTable[10][5] = {"", "", "abc", "def", "ghi", "jkl",
            "mno", "pqrs", "tuv", "wxyz"};

1 个答案:

答案 0 :(得分:1)

有关此详细/增强示例应用程序的一些事情。

  • 我认为您确实不需要uiOutputrenderUI,因为您要尝试的是更改selectInput中的可用选项。
  • 我包含了一些详细信息,因此(例如)您可以看到req正常运行,容易被禁用或删除(我经常在自己的闪亮应用中使用此代码,默认情况下处于禁用状态,以备不时之需)可能涉及反应性)。 (如果看到In:而没有相应的Out:,则意味着req线路由于需求不足而中断了流量。)
  • 您在示例中引用了file2,但从未设置过...我忽略了它,但我认为您可以扩展ui来容纳它,并使用server逻辑来处理它。
  • 使用sqldf通常是足够安全的,但是它建议的SQL不能(直接)防止SQL注入。如果使用用户定义的自由文本进行这些查询,则应采取更多保护措施。
  • 我在下拉菜单中添加了defcat,这是“选择类别”类型的消息。因为显然不是您要过滤的东西,所以我明确确保它不是过滤(并因此呈现)之前的选定类别。

鉴于此,我将给出两个结果:一个不带renderUI,另一个带它。


第一个,没有:

library(shiny)
library(sqldf)

defcat <- "Select a category ..."
ui <- fluidPage(
  sidebarPanel(
    fileInput("file1", "Import", accept = ".xlsx"),
    selectInput("selectCAT", "Category", choices = defcat),
    actionButton("goBu", "Click!")
  ),
  mainPanel(
    "Display Results",
    tableOutput("acBTTON")
  )
)

verbose <- TRUE
msg <- if (verbose) message else c

server <- function(input, output, session) {
  dat_mt <- eventReactive(input$file1, {
    msg("In: dat_mt ...")
    req(input$file1)
    out <- readxl::read_excel(input$file1$datapath, "mt")
    msg("Out: dat_mt ...")
    out
  })
  dat_ir <- eventReactive(input$file1, {
    msg("In: dat_ir ...")
    req(input$file1)
    out <- readxl::read_excel(input$file1$datapath, "ir")
    msg("Out: dat_ir ...")
    out
  })

  observeEvent(dat_mt(), {
    msg("In: observe dat_mt() ...")
    req(dat_mt())
    sel <- if (input$selectCAT %in% dat_mt()$cyl) input$selectCAT else defcat
    updateSelectInput(session, "selectCAT",
                      choices = c(defcat, sort(unique(dat_mt()$cyl))),
                      selected = sel)
    msg("Out: observe dat_mt() ...")
  })

  pf <- eventReactive(input$goBu, {
    msg("In: event input$goBu ...")
    req(defcat != input$selectCAT, dat_mt(), dat_ir())
    mt <- dat_mt()
    ir <- dat_ir()
    # WARNING: potential for SQL injection, proof-of-concept only
    out <- sqldf(paste("select * from mt where cyl =", input$selectCAT))
    msg("Out: event input$goBu ...")
    out
  })

  output$acBTTON <- renderTable({
    msg("In: acBTTN ...")
    req(pf())
    out <- pf()
    msg("Out: acBTTN ...")
    out
  })
}
shinyApp(ui, server)

第二个,带有动态UI。注意只有两个区别:

ui <- fluidPage(
  sidebarPanel(
    fileInput("file1", "Import", accept = ".xlsx"),
    ## replace selectInput with this:
    uiOutput("selectCATdyn"),
    ## end dif
    actionButton("goBu", "Click!")
  ),
  mainPanel(
    "Display Results",
    tableOutput("acBTTON")
  )
)

server <- function(input, output, session) {
  dat_mt <- eventReactive(input$file1, {
    msg("In: dat_mt ...")
    req(input$file1)
    out <- readxl::read_excel(input$file1$datapath, "mt")
    msg("Out: dat_mt ...")
    out
  })
  dat_ir <- eventReactive(input$file1, {
    msg("In: dat_ir ...")
    req(input$file1)
    out <- readxl::read_excel(input$file1$datapath, "ir")
    msg("Out: dat_ir ...")
    out
  })

  ## replace observeEvent(dat_mt(),... with      
  output$selectCATdyn <- renderUI({
    req(dat_mt(), dat_ir())
    selectInput(inputId = "selectCAT", label = "Selection",
                choices = c(defcat, sort(unique(dat_mt()$cyl))),
                selected = defcat)
  })
  ## end diff

  pf <- eventReactive(input$goBu, {
    msg("In: event input$goBu ...")
    on.exit( msg("Out: event input$goBu ...") )
    req(defcat != input$selectCAT, dat_mt(), dat_ir())
    mt <- dat_mt()
    ir <- dat_ir()
    # WARNING: potential for SQL injection, proof-of-concept only
    out <- sqldf(paste("select * from mt where cyl =", input$selectCAT))
    out
  })

  output$acBTTON <- renderTable({
    msg("In: acBTTN ...")
    req(pf())
    out <- pf()
    msg("Out: acBTTN ...")
    out
  })
}

在我玩这个游戏的过程中,我意识到了为什么要使用动态UI,所以它现在“更有意义”:-)

不过,请注意:通过静态定义它(如我的第一个解决方案),并在另一个shinyjs::hide块中使用shinyjs::disableobserve,您可以产生类似的效果。


设置:

wb <- openxlsx::createWorkbook()
openxlsx::addWorksheet(wb, "mt")
openxlsx::writeDataTable(wb, "mt", x = mtcars)
openxlsx::addWorksheet(wb, "ir")
openxlsx::writeDataTable(wb, "ir", x = iris)
openxlsx::saveWorkbook(wb, "Johnseito.xlsx")