[英]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.