1

以下の作業コードを見つけてください。基本的に、ユーザーが一度に誰でも変更できるようにする 3 つの numericInputs があり、他の 2 つは自分自身を適応させる必要があり、結果として 1 になります。

A + B + C = 1 ただし、連動しているため、不安定なようです。どうすればそれを安定させ、ユーザーが任意の 1 つの変数を変更できるようにすることができますか: A と他の 2 つの変更は合計すると 1 になります。

ここでの回答に基づいて、以下に示すように作業コードを作成しました。

相互に依存する光沢のある入力値を接続する

R を使用した Shiny アプリケーションでの依存入力

library(shiny)
ui <- shinyUI(fluidPage(
  titlePanel("Mutually Dependent Input Values"),
  sidebarLayout(
    sidebarPanel(
      numericInput("A", "A",.333),
      numericInput("B", "B",.333),
      numericInput("C", "C",.333)
    ),
    mainPanel(
      verbatimTextOutput("result")
    )
  )
)) 
server <- shinyServer(function(input, output,session) {

  observeEvent(input$A,{
    newB <- 1 - input$A - input$C 
    updateNumericInput(session, "B", value = newB) 
    newC <- 1 - input$A - input$B 
    updateNumericInput(session, "C", value = newC) 
  })
  observeEvent(input$B,{
    newC <- 1 - input$B - input$A 
    updateNumericInput(session, "C", value = newC) 
    newA <- 1 - input$B - input$C 
    updateNumericInput(session, "A", value = newA) 
  })
  observeEvent(input$C,{
    newA <- 1 - input$C - input$B 
    updateNumericInput(session, "A", value = newA) 
    newB <- 1 - input$C - input$C 
    updateNumericInput(session, "B", value = newB) 
  })


})
shinyApp(ui,server)

基本的に、ユーザーは数値入力: A、B、または C のいずれかを自由に更新できます。他の 2 つの数値入力は、合計が 1 になるように適応する必要があります。現在、それらは相互にリンクされているため、不安定なようです (上記のコードを参照してください)。エラーを再生成します)

####### 独自のソリューションによる異なるアプローチ

ui <- fluidPage(
  column(6, 
         tags$h2("Set parameters"),
         numericInput("valueA", "Value1", value = .333, min = 0, max = 1, step = .1),
         numericInput("valueB", "Value2", value = .333, min = 0, max = 1, step = .1),
         numericInput("valueC", "Value3", value = .333, min = 0, max = 1, step = .1)
  ),
  column(6,
         uiOutput("ui")
  )
)

server <- function(input, output, session) {
  output$ui <- renderUI( {
    tagList(
      tags$h2("Display in %"),
      numericInput("obs1", "Label1", value = 100 * (input$valueA / (input$valueA + input$valueB + input$valueC))),
      numericInput("obs2", "Label2", value = 100 * (input$valueB / (input$valueA + input$valueB + input$valueC))),
      numericInput("obs2", "Label2", value = 100 * (input$valueC / (input$valueA + input$valueB + input$valueC)))
    )
  })
}

shinyApp(ui, server)   

4

1 に答える 1