Как отключить параметр редактирования для отображаемых значений в блестящем? - PullRequest
0 голосов
/ 05 мая 2019

Мы разрешаем пользователям обновлять любой из 3 входов. Блестящий рассчитывает соотношение между ними и отображает в%. Тем не менее, это отображаемое значение можно редактировать в блестящем.

Поскольку отображаемое значение необходимо для дальнейшего расчета в коде, такое поведение нежелательно.

Следовательно, кто-то может помочь отобразить значения в%, но позволить пользователю не редактировать их.

Пожалуйста, найдите ниже представленный код. Пытался 1. Сделать как печать и спринт, но трудно отформатировать 2. Отключил renderUI, но затем код не работал, так как renderUI не запускался.


library(shiny)

ui <- fluidPage(
  column(6, 
         tags$h2("Allow the user to change only here"),
         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),
         verbatimTextOutput("result")
   ),
  column(6,
          uiOutput("ui")
   )
)

server <- function(input, output, session) {
  output$ui <- renderUI( {
    tagList(
      tags$h2("Display in % but dont allow user to change here"),
      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("obs3", "Label3", value = 100 * (input$valueC / (input$valueA + input$valueB + input$valueC)))

    )
  })
  # Since the below option is hard to render like above 
  # output$result <- renderPrint({
  #   print(sprintf("A=%.3f, B = %.3f", 
  #                 input$obs1,input$obs2))
  # })

  #### Code to use the values from obs1,obs2,obs3....
}

shinyApp(ui, server)

В основном, 3 значения, где пользователи могут редактировать и отношения (%) должны отображаться. Однако эти проценты не должны редактироваться .

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Хорошо, я думаю, что получил то, что ты хочешь сделать. Вам необходимо хранить значения либо в реактивной «переменной», либо в реактивных значениях (которые оба могут прослушивать входные изменения). В следующих примерах показаны оба варианта, а также то, что вы можете работать с ними позже.

library(shiny)

ui <- fluidPage(
  column(6, 
         tags$h2("Allow the user to change only here"),
         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),
         verbatimTextOutput("result")
  ),
  column(6,
         uiOutput("ui1"),
         tags$hr(),
         uiOutput("ui2"),
         tags$hr(),
         tags$h3("Obs1 * 2"),
         verbatimTextOutput("obs1")
  )
)

server <- function(input, output, session) {

  ### reactive "variables"
  obs1 <- reactive({
    as.numeric(100 * (input$valueA / (input$valueA + input$valueB + input$valueC)))
  })
  obs2 <- reactive({
    as.numeric(100 * (input$valueB / (input$valueA + input$valueB + input$valueC)))
  })
  obs3 <- reactive({
    as.numeric(100 * (input$valueC / (input$valueA + input$valueB + input$valueC)))
  })
  ### or as reative values which I like more
  # create
  obs <- reactiveValues(obs1 = NULL,
                        obs2 = NULL,
                        obs3 = NULL)
  # listen to changes
  observe({
    obs$obs1 <- as.numeric(100 * (input$valueA / (input$valueA + input$valueB + input$valueC)))
    obs$obs2 <- as.numeric(100 * (input$valueB / (input$valueA + input$valueB + input$valueC)))
    obs$obs3 <- as.numeric(100 * (input$valueC / (input$valueA + input$valueB + input$valueC)))
  })

  ### render ui of reactives variable
  # ! note the function notation of obs1() to obs3()
  output$ui1 <- renderUI( {
    tagList(
      tags$h3("Display in % but dont allow user to change here"),
      renderText( obs1() ),
      renderText( obs2() ),
      renderText( obs3() )
    )
  })

  ### render ui of reactive values
  # ! note: variable called as a normal list
  output$ui2 <- renderUI( {
    tagList(
      tags$h3("Display in % but dont allow user to change here"),
      renderText( obs$obs1 ),
      renderText( obs$obs2 ),
      renderText( obs$obs3 )
    )
  })

  ### Code to use the values from obs1,obs2,obs3....
  output$obs1<- renderText(obs$obs1 * 2)
}

shinyApp(ui, server)
0 голосов
/ 05 мая 2019

Я бы предпочел распечатать его как verbatimeTextOutput, но это не возможно в renderUi (насколько я знаю). renderText работает в renderUI, но, должно быть, вывод не так хорош в строке. Что я не понимаю? Почему бы вам не разрешить вводить проценты и пересчитывать, если вам нужны значения 0-1.

library(shiny)

ui <- fluidPage(
  column(6, 
         tags$h2("Allow the user to change only here"),
         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),
         verbatimTextOutput("result")
  ),
  column(6,
         uiOutput("ui")
  )
)

server <- function(input, output, session) {
  output$ui <- renderUI( {
    tagList(
      tags$h2("Display in % but dont allow user to change here"),
      renderText(paste(100 * (input$valueA / (input$valueA + input$valueB + input$valueC)))),
      renderText(paste(value = 100 * (input$valueB / (input$valueA + input$valueB + input$valueC)))),
      renderText(paste(value = 100 * (input$valueC / (input$valueA + input$valueB + input$valueC))))
    )
  })
  # Since the below option is hard to render like above 
  output$result <- renderText({
    paste(100 * (input$valueA / (input$valueA + input$valueB + input$valueC)),'%')
  })

  #### Code to use the values from obs1,obs2,obs3....
}

shinyApp(ui, server)
...