R Shiny - 我在“Renderplot”中创建了一个数据框,并希望在此之外访问它我怎样才能使它具有反应性?

问题描述

我在渲染绘图函数中创建了一个数据框并绘制了它。我想访问此数据框中“基金”列的最后一个值并将其插入到信息框中。在附加的代码中,我的信息框中的基金价值没有反应。

我尝试简单地获取生成数据框的代码块并将其插入到反应函数中,然后在信息框和渲染图函数调用它,但随后两者都无法工作。是否可以创建反应式数据框?如果是这样,我可以只访问数据框中的一个值吗?我对这一切都很陌生,所以如果以下代码混乱,我深表歉意。

server <- function(input,output) {
  output$line <- renderPlot({
    intrate <- input$int/100    #where I created the data frame
    fund <- as.numeric()
    return <- as.numeric()
    draw <- as.numeric()
    fund[1] <- input$pot
    draw[1] <- input$dd
    age <- c(input$age:94)
    for(i in 1:(95-input$age)){
      draw[i+1] <- draw[i]*(1+input$inf/100)
      return[i] <- fund[i]*intrate
      fund[i+1] <- max(0,fund[i] + return[i] - draw[i]) 
    }
    draw <- head(draw,-1)
    fund<- head(fund,-1)
    data <- as.data.frame(cbind(age,fund,draw,return))
    

#my plot
    ggplot(data = data,mapping = aes(age,fund)) +
      geom_line(color="red",size=1,alpha=0.9,linetype=1) +
      scale_y_continuous(labels = function(x) format(x,scientific = FALSE),limits = c(0,NA))+
      labs(y = "Fund (€)",x = "Age (Years)")+
      theme_light()
  })
  
  output$fad <- renderInfoBox(       ##where I want to access fund for an infoBox
    
    infoBox(title = "Fund at Death",paste0(round(tail(fund,n=1),2)),icon = icon("credit-card"),color = "blue")
  )
  
}

为了提供上下文,我正在创建一个养老金提取计算器,其中输入退休年龄,假设死亡年龄为 95 岁。

解决方法

这样应该可以:

server <- function(input,output) {
  data <- reactive({
    intrate <- input$int/100    #where I created the data frame
    fund <- as.numeric()
    return <- as.numeric()
    draw <- as.numeric()
    fund[1] <- input$pot
    draw[1] <- input$dd
    age <- c(input$age:94)
    for(i in 1:(95-input$age)){
      draw[i+1] <- draw[i]*(1+input$inf/100)
      return[i] <- fund[i]*intrate
      fund[i+1] <- max(0,fund[i] + return[i] - draw[i]) 
    }
    draw <- head(draw,-1)
    fund<- head(fund,-1)
    data <- as.data.frame(cbind(age,fund,draw,return))
  })

  output$line <- renderPlot({
  #my plot
    ggplot(data = data(),mapping = aes(age,fund)) +
      geom_line(color="red",size=1,alpha=0.9,linetype=1) +
      scale_y_continuous(labels = function(x) format(x,scientific = FALSE),limits = c(0,NA))+
      labs(y = "Fund (€)",x = "Age (Years)")+
      theme_light()
  })
  
  output$fad <- renderInfoBox(       ##where I want to access fund for an infobox
    
    infoBox(title = "Fund at Death",paste0(round(tail(fund,n=1),2)),icon = icon("credit-card"),color = "blue")
  )
  
}

总结:您将 data.frame 部分放入反应式表达式中,我们通过引用 data() 将其调用到绘图中