Функция ShinyApp не возвращает результат - PullRequest
0 голосов
/ 24 марта 2020

Мне нужна помощь с приведенной ниже блестящей функцией сервера приложений. Моя проблема в том, что values$npv всегда выходит нулевым, даже с 0. и я думаю, что функция fun не работает правильно, и у меня нет идей. Если я жестко закодирую renderText с paste("Net Present Value:", isolate(input$val_inv)), у меня всегда будет результат, но не то, что я хочу, и это заставляет меня догадываться, что функция fun не работает должным образом.

     inline_numericInput=function(ni){
  tags$div( class="form-inline",ni)
}

ui <- shinyUI(fluidPage(
  tags$head(tags$style("#side_panel{
                       padding-left:10px;
                       }
                       .form-group {
                       margin-bottom: 15px !important;
                       }
                       .form-inline .form-control {
                       width:80%;
                       }
                label{ width:30px;}

                       ")),

  titlePanel("Example"),

  sidebarLayout(

    sidebarPanel(width = 4,id="side_panel",
                 fluidRow(
                   column(6, inline_numericInput(numericInput("val_inv", label = "Inv:", value = 0))),
                 ),
                 fluidRow(
                   column(6, inline_numericInput(numericInput("val_r", label = "R:", value = 0))),
                 ),
                 fluidRow(
                   column(6, inline_numericInput(numericInput("val_n", label = "N:", min = 50,value = 50))),
                   column(6, inline_numericInput(actionButton("btn_calcnpv", label = "Compute NPV")))
                 )

    ),

    mainPanel(
      p('Results:'),
    textOutput("val_npv")
    )
  )
))

server <- function(input, output) {

    values <- reactiveValues()
    values$npv <- 0

    observe({
        input$btn_calcnpv
        fun <- function(n){
            cf <- 0
            for (i in 1:n){
               cf <- cf + isolate(input$val_inv)/(1+input$var_r)**i
            }
            cf
        }
        values$npv <- fun(isolate(input$val_n))- isolate(input$val_inv)
        #values$npv <- values$npv - isolate(input$val_inv)
    })

    output$val_npv <- renderText({
        if(input$btn_calcnpv)
            paste("Net Present Value:", values$npv)
        else ""
    })

}

shinyApp(ui, server) 

1 Ответ

0 голосов
/ 26 марта 2020

Вот ответ, используя eventReactive и не так много разобщений. Кроме того, входные данные приводятся к числам до того, как произойдет расчет. Используя eventReactive, расчет запускается нажатием кнопки вычисления.

server <- function(input, output) {


  npv <- eventReactive(input$btn_calcnpv, {

    val_inv <- as.numeric(input$val_inv)
    val_r <- as.numeric(input$val_r)
    val_n <- as.numeric(input$val_n)
    fun <- function(n){
      cf <- 0
      for (i in 1:n){
        cf <- cf + val_inv/(1+val_r)**i
      }
      cf
    }
    temp <- fun(val_n)- val_inv
    temp
  })

  output$val_npv <- renderText({
      req(npv())
      paste("Net Present Value:", npv())

  })

}
...