有光泽的:读取verbatimTextOutput的文本内容

时间:2017-10-03 15:57:10

标签: r shiny

是否可以将Shiny应用中的verbatimTextOutput元素的文本内容读作变量?

以下sample app的想法是,当用户点击button1时,text2的内容会更新并显示text1中的内容(" Hello world"在这种情况下)。

下面的observeEvent处理程序会生成此错误:Warning: Error in $.shinyoutput: Reading objects from shinyoutput object not allowed.但是这对我来说是最接近我设法找到解决方案的。

任何帮助都将不胜感激。

谢谢,

雨果

library(shiny)

shinyApp(
    ui = basicPage(verbatimTextOutput("text1"),
                   actionButton("button1", "Read & copy text!"),
                   verbatimTextOutput("text2")),

    server = function(input, output, session) {

        output$text1 <- renderText("Hello world")
        output$text2 <- renderText("Waiting for new text...")

        observeEvent(input$button1, {
            output$text2 <- output$text1
        })
    }
)

3 个答案:

答案 0 :(得分:0)

您可以将text1对象的输出存储到变量并传递该变量。我建议你使用session$userData对象,因为它是你闪亮会​​话的一部分,你不必全局声明变量。以下是代码

library(shiny)

shinyApp(
  ui = basicPage(verbatimTextOutput("text1"),
                 actionButton("button1", "Read & copy text!"),
                 verbatimTextOutput("text2")),

  server = function(input, output, session) {

    output$text1 <- renderText({
      session$userData$text1 <- "Hello world"
      session$userData$text1})
    output$text2 <- renderText("Waiting for new text...")

    observeEvent(input$button1, {
      output$text2 <- renderText(session$userData$text1)
    })
  }
)

答案 1 :(得分:0)

    library(shiny)

    shinyApp(
      ui = basicPage(textInput("text1","","",placeholder = "Hello World"),
                     actionButton("button1", "Read & copy text!"),
                     verbatimTextOutput("text2")),

      server = function(input, output, session) {

        text2 <- eventReactive(input$button1,{
          input$text1
        })

        output$text2 <- renderText({
          validate(
            need(input$button1,"Waiting for new text....")
          )
          text2()
        }
        )
      }
    )

但是如果你想要的方式与你完全一样。所以,就是这样。

    library(shiny)

    shinyApp(
      ui = basicPage(verbatimTextOutput("text1"),
                     actionButton("button1", "Read & copy text!"),
                     verbatimTextOutput("text2")),

      server = function(input, output, session) {

        output$text1 <- renderText("Hello world")
        output$text2 <- renderText({
          validate(
            need(input$button1,"Waiting for new text...")
          )
          "Hello world"
          })
      }
    )

答案 2 :(得分:0)

使用shinyjs

如果要读取任何带有id的标签上的文本,请将其保存在输入中。您可以使用pakage shinyjs和一些js代码来阅读文本,然后使用Shiny.onInputChange ()创建输入。下面的代码解决了您的问题

library(shiny)
library(shinyjs)

shinyApp(
  ui = basicPage(useShinyjs(),verbatimTextOutput("text1"),
                 actionButton("button1", "Read & copy text!"),
                 verbatimTextOutput("text2")),

  server = function(input, output, session) {

    output$text1 <- renderText("Hello world")
    output$text2 <- renderText("Waiting for new text...")

    observeEvent(input$button1, {
      runjs("var textin1=$('#text1').text();
            Shiny.onInputChange('textin1', textin1);
            ")
      output$text2 <- renderText({input$textin1})
    })
  }
)