Блестящие модули: хранить параметры (дополнительный аргумент) уже при создании пользовательского интерфейса модуля вместо передачи его функции сервера модуля? - PullRequest
0 голосов
/ 23 ноября 2018

Я создал модуль sliderCheckbox, который объединяет sliderInput и checkBoxInput для отключения sliderInput - по сути, возможность заявить "Я не знаю", что необходимо для входных данных, подобных опросам.Когда слайдер отключен, я хочу, чтобы он возвращал значение по умолчанию - чаще всего начальное значение, но не обязательно.

Теперь мой вопрос: Есть ли возможность передать это значение по умолчанию при инициализации пользовательского интерфейса, то есть с sliderCheckboxInput()? Поскольку значением по умолчанию является свойство, такое как минимум и максимум,вот где он логически принадлежит, и он также лучше подходит для остальной части моей установки.

Пример:

library(shiny)
library(shinyjs)

sliderCheckboxInput <- function(id,description="",
                                min = 0,
                                max = 100,
                                value = 30,
                                default= NULL ##HERE I would want the default value to be set
                                cb_title = "I don't know"){
  ns <- NS(id)

  fluidRow(
    column(width=9,
           sliderInput(ns("sl"),
                       paste0(description, collapse=""),
                       min = min,
                       max = max,
                       value = value)
    ),
    column(width=2,
           checkboxInput(ns("active"),
                         cb_title, value=FALSE )
    )
  )
}

sliderCheckbox<- function(input, output, session,
                          default=NA) { #Problem: set default when initialising module

  oldvalue<- reactiveVal()

  observeEvent(input$active, {
    if (input$active){
      oldvalue(input$sl)
      disable("sl")
      updateSliderInput(session, "sl", value=default)
    }else {
      updateSliderInput(session, "sl", value=oldvalue())
      enable("sl")
    }

    toggleState("sl", !input$active)
  })

  onclick("sl",
          if(input$active) updateCheckboxInput(session, "active", value=FALSE)
  )

  return ( reactive({
    if (input$active){
      default
    }else {
      input$sl
    }
  }))

}


ui <- fluidPage(

  useShinyjs(),

  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      sliderCheckboxInput("bins", "Number of bins:",
                          min = 1,
                          max = 50,
                          value = 30)
    ),

    # Show a plot of the generated distribution
    mainPanel(
      plotOutput("distPlot")
    )
  )
)

server <- function(input, output, session) {
  bins_nr <- callModule(sliderCheckbox, "bins", default=44)

  output$distPlot <- renderPlot({

    # generate bins based on input$bins from ui.R
    x    <- faithful[, 2]
    bins <- seq(min(x), max(x), length.out = bins_nr() + 1)

    # draw the histogram with the specified number of bins
    hist(x, breaks = bins, col = 'darkgray', border = 'white')

  })

}

shinyApp(ui, server)

1 Ответ

0 голосов
/ 24 ноября 2018

Вы можете отправить значение из пользовательского интерфейса на сервер, используя скрытый textInput

library(shiny)
library(shinyjs)

sendValueToServer <- function(id, value) {
  hidden(textInput(
    id, "If you can see this, you forgot useShinyjs()", value
  ))
}

myModuleUI <- function(id, param) {
  ns <- NS(id)
  tagList(
    sendValueToServer(ns("param_id"), param),
    textOutput(ns("text_out"))
  )
}

myModule <- function(input, output, session) {
  param <- isolate(input$param_id)

  output$text_out <- renderText({
    param
  })
}

shinyApp(
  ui = fluidPage(
    useShinyjs(),
    myModuleUI("id", "test")
  ),
  server = function(input, output, session) {
    callModule(myModule, "id")
  }
)

Возможно, есть более прямые способы сделать это, используя блестящий JavaScript API, но это "чистый"R "решение, которое должно быть достаточно для большинства случаев использования.Обратите внимание, что вы можете использовать входное значение во время инициализации с

isolate(input$text_in)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...