Shiny - 反应循环内的 runif 函数

Shiny - runif function inside reactive loop

希望有人可以帮助解决这个问题:

我下面的代码按我的意图返回一个动态 table,但是当我创建 for 循环以分别为 table 中的每个 [k,p] 位置分配随机数时,所有计算停止,我看到一个空的 UI.

如果不是
rv$MCProbTable[[k,p]] = round(as.numeric(stats::runif(1,0,100)), 3)
我用例如
rv$MCProbTable[[k,p]] = 2
我看到在 table 的每个位置都分配了“2”,这与我想要的很接近,表明一切都在运行 runif 应用程序。那么是函数的问题吗?或者很可能是反应式 for 循环设置不正确?

谢谢,希望这是一个简单的过程!

## LIBRARIES
        library(tidyverse)
        library(stats)
        library(data.table)
        library(triangle)
        library(base)
        library(matrixStats)
        library(ggplot2)
        library(ggthemes)
        library(readxl)
        library(httr)
        library(writexl)
        library(shiny)


    ExcelTemplate <- tempfile(fileext = ".xlsx")
    GET(url = "https://www.openmontecarlo.com/SampleS.xlsx",write_disk(ExcelTemplate))
    defaultRR <- read_xlsx(ExcelTemplate)
    
## DEFINE UI

ui <- fluidPage(
    
            numericInput("ISvModels", label = h3("Select how many scenarios to run in the model:"),value=10,min=5,max=10000),
    hr(),

    mainPanel(

fluidRow(

        p("vModels"),
        textOutput("vModelsText"),

        p("vtModels"),
        textOutput("vtModelsText"),

        p("Scenarios"),
        textOutput("SnScenarios"),

        h3(strong("ProbTable")),
        br(),
        dataTableOutput("SMCProbTable"),
        hr()        
    )
)
)

server <- function(input, output, session) {

## CREATE DEFAULT RR AND REACTIVE VARIABLES

rv <- reactiveValues(
    vModels = 10,
    nScenarios = 10,
    vtModelScenarios = NULL,
    RRDT = data.frame(),
    nRisks = 1,
    MCProbTable = data.frame(),
    p = 1,
    k = 1
    )

## PROCESS MODELS INPUT

    observe({rv$vModels <- as.numeric(unlist(input$ISvModels))})
        output$vModelsText <- renderPrint({unlist(rv$vModels)})

    qtModels <- reactive({length(unlist(rv$vModels))})
        output$qtModelsText <- renderPrint({unlist(qtModels())})

    vtModels <- reactive({paste0("M",1:qtModels()," n = ",rv$vModels," scenarios")})
        output$vtModelsText <- renderPrint({unlist(vtModels())})

## RR TABLE

    observe({rv$nRisks <- nrow(defaultRR)})

###############################################################################################################
## CALCULATE SCENARIOS - CREATE DATA TABLES AND TEXT VECTORS FOR EACH SCENARIO


## Vectors for SINGLE scenario

    observe({rv$nScenarios <- rv$vModels})

    observe({rv$vtModelScenarios <- paste0("Scenario ",1:rv$nScenarios,"/",rv$vModels)})

## CREATE PROBABILITY TABLE AND CALCULATE PROBABILITIES

    observe({rv$MCProbTable <- data.frame(matrix(nrow=rv$nRisks,ncol=rv$nScenarios))})
    observe({rownames(rv$MCProbTable) <- rv$RRDT$ID})
    observe({colnames(rv$MCProbTable) <- rv$vtModelScenarios})

    observe({
    for (p in 1:rv$nScenarios){
        for (k in 1:rv$nRisks){
                rv$MCProbTable[[k,p]] = round(as.numeric(stats::runif(1,0,100)), 3)
        }
        }
    })  

    output$SMCProbTable <- renderDataTable({rv$MCProbTable})

}

# Run the app ----
shinyApp(ui = ui, server = server)

在你的 for 循环中,使用 isolate()

for (p in 1:rv$nScenarios){
  for (k in 1:rv$nRisks){
    isolate(
      rv$MCProbTable[k,p] <-  round(as.numeric(stats::runif(1,0,100)), 3)
    )
  }
}