更新文本多个动作按钮 - R Shiny

时间:2016-12-17 19:06:40

标签: r shiny

以下是该方案:

我有一个名为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个动作按钮说(动作1,......,动作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]
        })
      })})

这改善了这种情况:早些时候我可以看到所有动作按钮同时执行(每个场景触发的进度消息)现在我只看到按钮上的相应按钮进度消息,但我不能为了获得输出,它仍然是第一个输出。

请帮助解决一些代码示例。

更新:当我添加打印(故事[,5])或打印(故事[,4])时,它会在控制台上打印,以便单击相应的按钮,但不会在闪亮的应用程序上打印。

2 个答案:

答案 0 :(得分:2)

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

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/>'))
      })

    })
)

答案 1 :(得分:1)

来自@Benjamin的提示我能够解决这个问题:

以下是有效的更改(采样代码):

terms<-reactiveValues(dta = NULL)

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