簡體   English   中英

當 shiny 應用程序通過單擊按鈕運行時,如何運行 R 腳本?

[英]How to run an R script when the shiny app is running with click of a button?

我的要求是在單擊按鈕時從 shiny 應用程序運行腳本,並在腳本運行后在 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))
}
    
  }

以下是使用reactiveVal的簡化示例。
我沒有 go 進入handsontable的細節,這將是另一個問題,但是input$OTableA不會這樣工作,因為它返回一個完整的表 object 而不僅僅是數據。

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM