【问题标题】:R Shiny not responding inputsR Shiny 没有响应输入
【发布时间】:2020-08-15 13:56:58
【问题描述】:

我正在使用 RStudio 中的 Shiny,我一直在尝试运行此代码:

# Vamos a simular modelos poisson compuestos con diferentes
# distribuciones de severidad.

library(actuar)
library(shiny)

# Define UI for application that draws a histogram
ui <- fluidPage(

    # Número de simulaciones
    headerPanel('Número de simulaciones'),
    numericInput(inputId = "n",label = NULL,
                 value = 10,min = 1,max = 20000),

    # Gráfica S exponencial.
    headerPanel('Exponencial'),
    sidebarPanel(
    sliderInput(inputId = 'lambda1',label = 'Lambda 1',value = 7,
                min = 0, max = 15),
    sliderInput(inputId = 'rate',label = 'rate',value = 5,
                    min = 0, max = 15),
    ),
    mainPanel(
        plotOutput('plot1')
    )

)



# Define server logic required to draw a histogram
server <- function(input, output) {


    output$plot1 <- renderPlot({
        #Preparativos para los gráficos:
        set.seed(20)
        n <- input$n
        lambda1 <- input$lambda1
        rate <- input$rate
        S1 <- rcompound(n = n, #Genera n
                        model.freq = rpois(lambda1), #N~Poi(lambda1)
                        model.sev = rexp(rate = 2)) #Y~Exp(rate)
        MASS::truehist(S1,
                       col=rainbow(125, start = 0.5, 1),
                       main = "exp",nbins = 125)
        abline(h=0,v=0,col="black",lwd=2)
    })

}

# Run the application 
shinyApp(ui = ui, server = server)

我的问题出在服务器函数上,不管我做什么,它一直告诉它找不到 lambda1,但我在 sliderInput 中定义了 lambda1!另一方面,这段代码完美运行:

n = 1234
#Exponencial
lambda1 <- 7 ; rate <- 5
S1 <- actuar::rcompound(n = n, #Genera n
               model.freq = rpois(lambda = lambda1), #N~Poi(lambda1)
               model.sev = rexp(rate = rate)) #Y~Exp(rate) 

怎么了?我已经尝试了好几天了!

【问题讨论】:

    标签: r input shiny output stochastic


    【解决方案1】:

    我查看了rcompound 的代码,但没有找到解决此问题的方法。

    一种可能是将lambda1 分配给全局环境:

    lambda1 <<- input$lambda1
    

    但这写在全局环境中...

    我会简单地使用我自己的rcompound 函数而不是使用包。这并不复杂:

    rcompound <- function(n, lambda, rate){
      N <- rpois(n, lambda)
      vapply(N, function(k) sum(rexp(k, rate = rate)), numeric(1))
    }
    

    【讨论】:

    • 效果很好!我坚持使用该软件包的想法。对不起,我只是想知道,vapply 函数的最后一个“numeric(1)”是干什么用的?
    • @EdgarAlarcón numeric(1)vapply 中函数输出的“模板”。这里函数返回一个数字。