【问题标题】:How to run an R script when the shiny app is running with click of a button?当闪亮的应用程序通过单击按钮运行时如何运行 R 脚本?
【发布时间】:2021-07-18 11:33:12
【问题描述】:

我的要求是每当单击按钮时从闪亮的应用程序运行脚本,并在脚本运行后在 UI 中显示结果。

我在服务器内部尝试了以下操作,但 UI 仅在我重新加载应用程序时才会显示更新的结果。

source("recalculate.R", local = TRUE)

以下内容根本不起作用。

observeEvent(input$recalculatebtn, source("recalculate.R", local = TRUE))

谁能帮我解决这个问题?

在下面添加一个非常基本的示例案例。

数据:

TableA = data.frame(A = c(1:3), B = c(4:6))

重新计算.R:

TableC = data.frame(C = TableA$A * TableA$B)

用户界面:

ui = shinyUI(
  fluidPage(
    
    
      sidebarPanel(
                    conditionalPanel(condition = "input.tabselected == 'tab1'", actionButton("recalcbtn", "Recalculate"))
                  ),
    mainPanel(uiOutput("mainpanel"))
    )
  )

服务器:

 server = function(input, output, session) {
   
    output$mainpanel = renderUI({
      
      tabsetPanel(
        tabPanel("ModifyTableA", value = 'tab1', rHandsontableOutput("OTableA")),
        tabPanel("UpdatedValues", value = 'tab2', DT::dataTableOutput("OTableC")),
        id ="tabselected"
      )
      
    })
     
    
    indat <- reactiveValues(data=TableA)
    
    output$OTableA = 
      renderRHandsontable({
        indat$data <- TableA
        rhandsontable(indat$data)
      })
    
    output$OTableC = DT::renderDataTable(TableC)
    
    observeEvent(input$recalcbtn,  

{
TableA <<- input$OTableA
source("Recalculate.R", local = TRUE))
}
    
  }

【问题讨论】:

  • recalculate.R 的结果应该是响应式表达式。你可以使用reactiveValues。如果您没有成功,请使用MRE of the remaining problems 编辑您的帖子。
  • 感谢您的回复。我添加了一个我想要实现的示例场景。如果您能帮助我,那就太好了。
  • 注意点:在本例中,我想修改第一个选项卡中的值,然后单击重新计算。然后脚本必须运行并刷新值。作为附加信息,在我的实际场景中,我还提供了在第一个选项卡中上传 excel 文件的选项,并且 excel 数据将显示在选项卡 1 中。

标签: r shiny shinydashboard shinyapps shiny-reactivity


【解决方案1】:

以下是使用reactiveVal 的简化示例。
我没有详细说明 handsontable 的细节,这将是另一个问题,但 input$OTableA 不会这样工作,因为它返回一个完整的表对象而不仅仅是数据。

library(rhandsontable)
TableA = data.frame(A = c(1:3), B = c(4:6))
TableC = data.frame(C = TableA$A )

library(shiny)
ui = shinyUI(
  fluidPage(


    sidebarPanel(
      conditionalPanel(condition = "input.tabselected == 'tab1'", actionButton("recalcbtn", "Recalculate"))
    ),
    mainPanel(uiOutput("mainpanel"))
  )
)

server = function(input, output, session) {

  output$mainpanel = renderUI({

    tabsetPanel(
      tabPanel("ModifyTableA", value = 'tab1', rHandsontableOutput("OTableA")),
      tabPanel("UpdatedValues", value = 'tab2', DT::dataTableOutput("OTableC")),
      id ="tabselected"
    )

  })

  TableC_react <- reactiveVal(TableC)
  indat <- reactiveValues(data=TableA)

  output$OTableA =
    renderRHandsontable({
      indat$data <- TableA
      rhandsontable(indat$data)
    })

  output$OTableC = DT::renderDataTable(TableC_react())

  observeEvent(input$recalcbtn,

               {

                 #source("Recalculate.R", local = TRUE)
                 result <- TableC_react()+1 # could be the result of Recalculate
                 TableC_react(result)
  })

}

shinyApp(ui=ui,server)

【讨论】:

  • 感谢您的回复。在上面的例子中,每点击一次按钮,表 C 就加 1。但是要求是在单击按钮时调用“Recalculate.R”脚本(我的真实世界“Recalculate.R”脚本非常冗长,我不能包含在闪亮的脚本中)。我错过了什么吗?
  • 正如我在回答中解释的那样,因为TableA &lt;&lt;- input$OTableA 不起作用,我只是展示了如何更新反应值。如果resultRecalculate.R 的结果,那么就使用TableC_react(result),看我的编辑
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2013-07-08
  • 1970-01-01
  • 2016-07-15
  • 2017-02-27
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多