在 R Shiny 中创建反应值链

问题描述 投票:0回答:1

我计划将大型 Excel 模型转换为 R Shiny。在开始编码之前,我想澄清几个方面。其中之一涉及从 Excel 转换依赖关系逻辑,我将使用下面的一个最小示例进行解释。

假设我们有一个输入,

Input 1
,和一个简单的
1 × 5 data frame
Year 1
的值基于真实数据。

enter image description here

  1. 后续年份的值取决于前几年。下面 Excel 中的公式视图演示了这种关系:

enter image description here

  1. 此外,
    Input 1
    也影响这些年: enter image description here

鉴于此方法将适用于 200 多个变量,我想知道创建反应值的最佳实践:

  1. 取决于先前数据(例如,
    Year 2
    )或反应数据(例如,从
    Year 3
    开始)。
  2. 也受到
    Input 1
    的影响。

我希望我没有想太多——任何反馈或建议将不胜感激。

r shiny
1个回答
0
投票

直接翻译是将每个公式单元格转换为反应式:

library(shiny)

ui <- fluidPage(
  sliderInput("input_1", "Input 1", min = 0.1, max = 2, value = 1.1),
  numericInput("year_1", "Year 1", value = 1),
  verbatimTextOutput("result"),
)

server <- function(input, output, session) {
  year_1 <- reactive(input$year_1)
  year_2 <- reactive(year_1() * input$input_1)
  year_3 <- reactive(year_2() * input$input_1)
  year_4 <- reactive(year_3() * input$input_1)
  output$result <- renderPrint({
    c(year_1(), year_2(), year_3(), year_4())
  })
}

shinyApp(ui, server)

如果存在递归模式,使用单个向量可能会更简单:

library(shiny)

ui <- fluidPage(
  sliderInput("input_1", "Input 1", min = 0.1, max = 2, value = 1.1),
  numericInput("year_1", "Year 1", value = 1),
  verbatimTextOutput("result"),
)

server <- function(input, output, session) {
  years <- reactive({
    values <- numeric(4)
    values[1] <- input$year_1
    for (i in seq_along(values)[-1]) {
      values[i] <- values[i - 1] * input$input_1
    }
    values
  })
  output$result <- renderPrint(years())
}

shinyApp(ui, server)

但是 R 中更惯用的方法是找到一个显式公式:

library(shiny)

ui <- fluidPage(
  sliderInput("input_1", "Input 1", min = 0.1, max = 2, value = 1.1),
  numericInput("year_1", "Year 1", value = 1),
  verbatimTextOutput("result"),
)

server <- function(input, output, session) {
  years <- reactive({
    input$year_1 * input$input_1^(seq_len(4) - 1)
  })
  output$result <- renderPrint(years())
}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.