【问题标题】:Update Text Multiple Action Buttons - R Shiny更新文本多个操作按钮 - R Shiny
【发布时间】:2017-05-03 07:04:37
【问题描述】:

这是场景:

我有一个名为 stories 的数据框,它由名为 abc() 的函数生成,其类型如下:

  X1 X2 X3 X4 X5
1 a  e  i  m  q
2 b  f  j  n  r
3 c  g  k  o  s
4 d  h  l  p  t

现在我在 ui.r 中给出了 5 个动作按钮说 (Action 1,..., Action 5)

现在,当用户选择操作 1 时,我想显示 stories[,1],类似操作 5 显示 stories[,5]

为了实现这一点,我编写了一个 If 语句,不幸的是,这只产生的值仅基于我最后一个 if 条件中的最后一个值

下面是server.R代码:

shinyServer(
  function(input,output,session){
            abc()
    terms<-reactive({
      if(input$analyse5){
      isolate({
        withProgress({
          setProgress(message = "Analyzing")
          stories[,5]
        })
      })}
      if(input$analyse4){
      isolate({
        withProgress({
          setProgress(message = "Analyzing")
          stories[,4]
        })
      })}
    if(input$analyse3){
      isolate({
        withProgress({
          setProgress(message = "Analyzing")
          stories[,3]
        })
      })}
    if(input$analyse2){
      isolate({
        withProgress({
          setProgress(message = "Analyzing")
          stories[,2]
        })
      })}
    if(input$analyse1){
      isolate({
        withProgress({
          setProgress(message = "Analyzing")
          stories[,1]
        })
      })}
    })

    output$text1<-renderUI({
      HTML(paste(h2(terms()[1]),terms()[2],terms()[3],terms()[4],sep='<br/><br/>'))
    })
  }
)

首先,只有当我按下第一个操作按钮时,它才会触发[a,b,c,d] 如果首先按下任何其他操作按钮,它不会产生任何结果,类似地,在按下第一个操作按钮然后按下其他操作按钮之后,它不会显示故事中的相应列,即说动作 2 没有给出 stories[,2]=[e,f,g,h] 而是保持为 [a,b,c,d] 理想情况下这意味着按钮没有响应

以下是供您参考的 ui.r:

shinyUI(
  fluidPage((
    titlePanel('Some Headline')),
    sidebarLayout(
      sidebarPanel(
        actionButton("analyse1","Action 1"),
        actionButton("analyse2","Action 2"),
        actionButton("analyse3","Action 3"),
        actionButton("analyse4","Action 4"),
        actionButton("analyse5","Action 5")
        ),
   mainPanel(
        h4(htmlOutput("text1"))
      ))))

编辑:尝试使用observeEvent

修改代码部分:

terms<-reactive({
      observeEvent((input$analyse5),{
      isolate({
        withProgress({
          setProgress(message = "Loading 5th Article...")
          stories[,5]
        })
      })})
      observeEvent((input$analyse4),{
      isolate({
        withProgress({
          setProgress(message = "Loading 4th Article...")
          stories[,4]
        })
      })})

这改善了这种情况:之前我可以看到所有操作按钮同时执行(每个场景触发的进度消息)现在我在单击按钮时只看到相应的按钮进度消息,但无法为了得到输出,它仍然是第一个。

请提供一些代码示例。

更新:当我添加 print(stories[,5]) 或 print(stories[,4]) 时,它会在控制台上打印以供单击相应按钮,而不是在 Shiny 应用程序上。

【问题讨论】:

  • 我建议用reactiveValues定义一个对象,然后将每个acroom按钮绑定到observeEvent,每个按钮都相应地修改了响应值
  • 感谢@Benjamin 的回复,我有点挣扎,你能帮我写一些虚拟代码吗?再次感谢

标签: r shiny


【解决方案1】:

这是一个完整的工作应用程序。我刚上电脑,所以没能早点提交。我提交它以防您仍然觉得它有用。

library(shiny)

stories <- matrix(letters[1:20], byrow = FALSE, nrow = 4)

shinyApp(
  ui = 
    shinyUI(
      fluidPage(
        titlePanel('Some Headline'),
      sidebarLayout(
        sidebarPanel(
          actionButton("analyse1","Action 1"),
          actionButton("analyse2","Action 2"),
          actionButton("analyse3","Action 3"),
          actionButton("analyse4","Action 4"),
          actionButton("analyse5","Action 5")
        ),
        mainPanel(
          h4(htmlOutput("text1"))
        )
      )
    )
  ),

  server = 
    shinyServer(function(input, output, session){
      Terms <- reactiveValues(
        Selection = 1
      )

      # using an observe block lets us listen for multiple events
      # without having to rewrite the code five times
      observe({
        lapply(sprintf("analyse%s", 1:5),
               function(x)
               {
                 observeEvent(input[[x]],
                              Terms$Selection <- as.numeric(sub("analyse", "", x)))
               })
      })

      output$text1<-renderUI({
        HTML(paste(stories[, Terms$Selection],collapse='<br/><br/>'))
      })

    })
)

【讨论】:

  • 谢谢@Benjamin,你太棒了:)
【解决方案2】:

在@Benjamin 的提示下,我能够解决这个问题:

以下是有效的更改(示例代码):

terms<-reactiveValues(dta = NULL)

observeEvent(input$analyse1,{
            withProgress({
              setProgress(message = "Loading 1st Article...")
            terms$dta<-stories[,1]
          })
          })

【讨论】:

  • 是的,这是我推荐的方法。
猜你喜欢
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2019-03-24
  • 2011-06-11
  • 2018-05-02
  • 2018-01-26
  • 1970-01-01
相关资源
最近更新 更多