微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当闪亮的应用程序通过单击按钮运行时如何运行 R 脚本?

如何解决当闪亮的应用程序通过单击按钮运行时如何运行 R 脚本?

我的要求是每当单击按钮时从闪亮的应用程序运行脚本,并在脚本运行后在 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 的简化示例。
我没有深入讨论 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。