【问题标题】:Returning value from a shiny app in an interactive R session在交互式 R 会话中从闪亮的应用程序返回值
【发布时间】:2020-12-29 23:32:25
【问题描述】:

我正在使用闪亮制作一个小的交互式小部件。小部件的目的不是创建一个独立的闪亮 Web 应用程序。相反,这个想法是在交互式 R 会话中运行小部件,以允许用户使用 GUI 交互式地操作会话中的数据。然后,Shiny 应用程序的输出应由该函数返回给用户会话。

我的小部件的“真正”目的是交互式地选择绘图上的数据点,并返回选择的值作为函数的输出。然而,为了制作一个漂亮而简单的 REPREX,我选择了一个更简单的场景:

multiply_me <-
  function(number1) {
    require(shiny)
    
    shinyApp(
      ui = fluidPage(
        selectInput('number2', label = 'Enter multiplication factor', choices = c(1, 2, 3)),
        textOutput('result')
        ),
      
      server = function(input, output) {
        output$result = renderText(number1 * as.numeric(input$number2))
      }
    )
    
  }

在 multiply_me 函数中,用户可以从现有的交互式会话 (number1) 中获取一个变量,然后运行 ​​multiply_me(number1) 来启动闪亮的小部件。然后,该小部件允许用户在滑块上选择乘法因子并查看结果。

但是如何将计算结果 (number1 * number 2) 返回到交互式 R 会话?

【问题讨论】:

  • 您可以使用&lt;&lt;-将结果存储在全局环境中。
  • 谢谢@StéphaneLaurent。尽管如果可能的话,我宁愿能够将值作为函数返回,以便具有更大的安全性和灵活性。对于更复杂的现实世界应用程序,我希望能够(例如)多次运行应用程序以生成不同的输出,以查看在小部件中选择不同数据点的效果。
  • @DGreenwood 您是否明白了您闪亮项目的“真正目的”?我正在开发一些非常相似的东西,并且一直在努力寻找如何从图中返回选定值的示例代码(我也是闪亮的新手)。如果您可以分享任何有启发性的内容,或者指出您使用的资源的方向,我将非常感激! :)

标签: r shiny


【解决方案1】:

你可以使用stopApp:

multiply_me <-
  function(number1) {
    require(shiny)
    
    runApp(list(
      ui = fluidPage(
        selectInput('number2', label = 'Enter multiplication factor', choices = c(1, 2, 3)),
        textOutput('result'),
        actionButton('ok','OK')
      ),
      
      server = function(input, output) {
        output$result = renderText(number1 * as.numeric(input$number2))
        observe({
          if(input$ok){
            stopApp(number1 * as.numeric(input$number2))}
         })
       }
    ))
  }

multiply_me(1)
[1] 2

【讨论】:

    【解决方案2】:

    您也可以在闪亮的小工具中使用stopApp

    library(shiny)
    library(miniUI)
    
    multiply_me <- function(number1) {
      
      ui <- miniPage(
        gadgetTitleBar("My Gadget"),
        miniContentPanel(
          selectInput(
            'number2', label = 'Enter multiplication factor', choices = c(1, 2, 3)
          ),
          textOutput('result')
        )
      )
      
      server <- function(input, output, session) {
        
        result <- reactive({
          number1 * as.numeric(input$number2)
        })
    
        output$result <- renderText(result())
        
        observeEvent(input$done, {
          returnValue <- result()
          stopApp(returnValue)
        })
        
        observeEvent(input$cancel, {
          stopApp()
        })
        
      }
      
      runGadget(ui, server)
    }
    

    小工具在 RStudio 查看器中打开,它有两个按钮“完成”和“取消”,因此您无需实现这些按钮。

    【讨论】:

      猜你喜欢
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 2021-10-14
      • 2019-05-20
      • 2018-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      相关资源
      最近更新 更多