是否可以用公式定义一个React值列表?

ruarlubt  于 2023-03-27  发布在  React
关注(0)|答案(1)|浏览(118)

我正在做一个闪亮的应用程序作为一个爱好,它是一个模型,变量随着时间的推移而变化,这取决于输入和其他计算字段。我已经使用了sliderinput和observevent来实现这一点,每个时间点都有标签,每个时间点的每个变量都有React,但这在ui和服务器上都造成了很多重复。
有没有更优雅/更有效的方法来完成这个任务?我知道reactivevalues可以用来创建一个reactive列表,但是我所看到的所有例子都是单独定义的值。
我希望有某种方法可以定义所有值的计算,例如,在下面的reprex中,类似于ccc(n)〈- reactive(input$a(n)* 2 + bbb(n-1)()* 3)
我试着做一个reprex来展示我正在尝试做的事情。在每个时间点为每个变量做出不同React的方法似乎有效,但我担心如果将来需要更改计算,更新每个变量所需的工作量。我正在处理的真实的用例有更多的变量和更多的时间点。感谢您的帮助

#package and data load

library(shiny)

library(dplyr)

#some read csv and other reference data used in formulas

#UI -------------------------------------------

ui <- fluidPage(

#tabs for each point in time

sidebarLayout(

mainPanel(

sliderInput(inputId = "time",
label = "Hour",
value = 1, min = 1, max = 3, width = '1000px'
),
),
mainPanel(
tabsetPanel(
id = "tabset",
type = "hidden",
# hour0 ==================
tabPanel("1",
fluidRow(
column(4,
#text input for first value
numericInput(inputId = "a1", label = "A1", value = 1),
),
column(4,
# text input for b1
numericInput(inputId = "b1", label = "B1", value = 0),
),
column(4,
#text output for c1
fluidPage(tags$b("C1")),
fluidPage(textOutput(outputId = "c1")),
),
),
),
tabPanel("2",
fluidRow(
column(4,
#text input for first value
numericInput(inputId = "a2", label = "A2", value = 1),
),
column(4,
#text output for b2
fluidPage(tags$b("b2")),
fluidPage(textOutput(outputId = "b2")),
),
column(4,
#text output for c1
fluidPage(tags$b("C2")),
fluidPage(textOutput(outputId = "c2")),
),
),
),
tabPanel("3",
fluidRow(
column(4,
#text input for first value
numericInput(inputId = "a3", label = "A3", value = 1),
),
column(4,
#text output for b2
fluidPage(tags$b("b3")),
fluidPage(textOutput(outputId = "b3")),
),
column(4,
#text output for c1
fluidPage(tags$b("C3")),
fluidPage(textOutput(outputId = "c3")),
), ), ), ), ), ), )

#Server ---------------------------------------------------
server <- function(input, output, session) {
#observe slider update to change time
observeEvent(input$time, {
updateTabsetPanel(session, "tabset", selected = paste0(input$time))
})
#hour 1 ---------------------------------------------
#A is input for hour 1
#B is input for hour 1
#text output for C hour 1
ccc1 <- reactive(input$a1 * 2)
output$c1 <- renderText(ccc1())
#hour 2 ---------------------------------------------
#A is input for hour 1
#text output for B hour 2
bbb2 <- reactive(input$a2 * 10)
output$b2 <- renderText(bbb2())
#text output for C hour 2
ccc2 <- reactive(input$a2 * 2 + input$b1 * 3)
output$c2 <- renderText(ccc2())
#hour 3 ---------------------------------------------
#A is input for hour 3
#text output for B hour 3
bbb3 <- reactive(input$a3 * 10)
output$b3 <- renderText(bbb3())
#text output for C hour 3
ccc3 <- reactive(input$a3 * 2 + bbb2() * 3)
output$c3 <- renderText(ccc3())
}

shinyApp(ui, server)
plupiseo

plupiseo1#

你可以使用一个无功导体,比如CCC,它返回一个列表,然后用CCC()[[1]]CCC()[[2]]等访问这个无功列表的元素。

library(shiny)

ui <- fluidPage(
  numericInput("a1", "A1", value = 2),
  numericInput("a2", "A4", value = 4),
  verbatimTextOutput("test")
)

server <- function(input, output, session) {
  
  BBB <- reactive({
    lapply(1:2, function(n) {
      an <- paste0("a", n)
      input[[an]] * 10
    })
  })
  
  CCC <- reactive({
    lapply(1:2, function(n) {
      bbb <- ifelse(n >= 2, BBB()[[n-1]], 0)
      an <- paste0("a", n)
      input[[an]] * 2 + bbb * 3
    })
  })
  
  output[["test"]] <- renderPrint({
    CCC()
  })
  
}

shinyApp(ui, server)

相关问题