Я создаю блестящее приложение, в котором можно нажимать на элементы вывода, чтобы установить входные переменные.Я делаю это, включая 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)