Можно ли инициализировать входные значения Shiny, не включая их в пользовательский интерфейс? - PullRequest
2 голосов
/ 30 апреля 2019

Я создаю блестящее приложение, в котором можно нажимать на элементы вывода, чтобы установить входные переменные.Я делаю это, включая Javascript, который вызывает метод Shiny.setInputValue.

Я хотел бы инициализировать эти значения, но не хочу, чтобы пользователь знал о них, поскольку они используются толькоза кулисами.Мой текущий взлом заключается в использовании функции hidden из библиотеки shinyjs вокруг некоторых кнопок в пользовательском интерфейсе, но это не очень удовлетворительно.Вот пример моего подхода:

library(shiny)
library(shinyjs)
library(tidyverse)

ui <- fluidPage(
  useShinyjs(),
  hidden(
    numericInput(label = NULL, inputId = 'INPUT', value = 0)
  ),
  DT::dataTableOutput("one_row")
)

server <- function(input, output) {
  script <- 'Shiny.setInputValue("INPUT", Math.random());'
  btn <- as.character(actionButton(inputId = 'button', 
                                   label = "Click me!", 
                                   onclick = script))
  one_row <- iris[1, ] %>% mutate(button = btn)
  output$one_row <- DT::renderDataTable({
    print(input$INPUT)
    one_row}, escape = FALSE)
}

shinyApp(ui = ui, server = server)

Итак, мой главный вопрос: есть ли лучший способ установить значения по умолчанию для этих «невидимых» входов?Должен ли я просто использовать функцию runjs где-нибудь в приложении?

С этим связан вопрос: возможно ли получить доступ к этим входным значениям с помощью javascript?Я надеялся, что было что-то вроде Shiny.getInputValue, но, похоже, его нет.

РЕДАКТИРОВАТЬ:

Вот более подробный пример, который точно показывает, что я пытаюсь сделать.Я использую visNetwork, но я хотел бы переопределить некоторые из поведения по умолчанию.Обычно, когда вы щелкаете по узлу, на нем отображаются все соединенные ребра, входящие или исходящие.

Я бы хотел, чтобы при выборе узла отображались только ребра в одном направлении, а затем, если вы щелкнете снова, в другом направлении.(вход, выход, выход, ...).Для этого мне нужно отслеживать клики (click), какой узел выбран (selected_node) и какое направление показывать в данный момент (out).

Для этого яВ настоящее время я использую visEvents для переопределения того, что происходит при клике, и visNetworkProxy для выбора узлов и ребер на основе этого клика.

library(shiny)
library(shinyjs)
library(tidyverse)
library(visNetwork)

ui <- fluidPage(
  useShinyjs(),
  hidden(
    numericInput(label = NULL, inputId = 'click', value = 0),
    numericInput(label = NULL, inputId = 'selected_node', value = 0)
  ),
  visNetworkOutput("network")
)

server <- function(input, output) {

  network <- reactive({
    nodes <- data.frame(id = 1:3)
    edges <- data.frame(expand.grid(to = 1:3, from = 1:3)) %>%
      mutate(id = row_number())
    list(nodes = nodes, edges = edges)
    })

  output$network <- renderVisNetwork({

    network <- network()

    visNetwork(network$nodes, network$edges) %>% 
      visPhysics(enabled = FALSE) %>%
      visLayout(randomSeed = 123) %>%
      visEdges(smooth = list(type = 'curvedCW'),
               arrows =list(to = list(enabled = TRUE, scaleFactor = 0.5))) %>% 
      visEvents(type = "on", 
                click = "function (properties) {
                          var nodeID = properties.nodes[0]
                          var edgeID = properties.edges[0];
                          if (nodeID) { Shiny.onInputChange('click', 1, {priority: \"event\"});
                                        Shiny.onInputChange('selected_node', nodeID)} 
                          else if (edgeID){ Shiny.onInputChange('click', 2);}
                          else { Shiny.onInputChange('click', 3);}}")
  })

  out <- FALSE

  observe({
    out <<- !out
    nodeID <- input$selected_node
    network <- network()

    # only fire if node was selected
    if(input$click == 1){
      edgeIDs <- network$edges %>% filter(to == nodeID) %>%
        pull(id)

      if(out){edgeIDs <- network$edges %>% filter(from == input$selected_node) %>% pull(id)}

      visNetworkProxy("network") %>%
        visSetSelection(nodesId = nodeID, edgesId = edgeIDs, highlightEdges = FALSE)
    }
  })
  }

shinyApp(ui = ui, server = server)
...