#shiny #shinydashboard #shinyjs
#блестящий #shinydashboard #shinyjs
Вопрос:
Я пытаюсь создать приложение, которое позволяет пользователю вводить данные, а затем позволяет серверу shiny вычислять некоторые результаты, например, я мог бы заставить shiny генерировать график или таблицу данных.
Однако из-за пространства пользовательского интерфейса у меня как бы «заканчивается» пространство. Поле ввода и документация приложения занимают весь экран. И когда shiny сгенерирует результаты, они будут отображаться в самом низу экрана.
Есть ли способ, которым я могу создать всплывающее окно shiny с сообщением, чтобы показать результат?
Мой sudo-код будет:
ui <- fluidPage(
textInput("text", "Name"),
numericInput("age", "Age", 20),
actionButton("demo", "Fill in fields with demo"))
server <- function(input, output, session) {
observeEvent(input$demo, {
****************************
OpenNewPage/MoveScreenDown()
****************************
updateTextInput(session, "text", value = H)
updateNumericInput(session, "age", value = "30")
})}
При нажатии кнопки «демо» всплывает окно сообщения, или я могу переместить экран в часть результата и разрешить текст в верхней части экрана.
Ответ №1:
Есть варианты отображения ваших результатов в отдельном окне. Но, может быть, будет проще разместить все в одном окне.
Вы можете использовать библиотеку shinyBS для создания модального окна для отображения графика. Другой вариант — использовать JavaScript для перемещения прокрутки в нижнюю часть страницы. Я привел два варианта в следующем примере, чтобы вы могли видеть, какой из них лучше для вас.
library(shiny)
library(shinyBS)
runApp(list(
ui = shinyUI(fluidPage(
textInput("text", "Name"),
numericInput("age", "Age", 20),
# option 1, using ShinyBS with a modal window
actionButton("demo", "Using a modal"),
# modal window to show the plot
bsModal("largeModalID","Results", "demo", size = "large", plotOutput('plot')),
# Option 2, action button with a JavaScript function to move the scroll to the bottom
# after drawing the plot.
actionButton("demoJS", "Using JS",
# there is a delay to allow the renderPlot to draw the plot and you should
# change it according to the processes performed
onclick = "setTimeout( function() {
$('html, body').scrollTop( $(document).height() );},
300)"),
# to plot the results after click on "Using JS"
uiOutput("plotUI")
)
),
server = shinyServer(function(input, output, session) {
output$plot <- renderPlot({
# simple plot to show
plot(sin, -pi, 2*pi)
})
output$plotUI <- renderUI({
# this UI will show a plot only if "Using JS" is clicked
if (input$demoJS > 0)
# the margin-top attribute is just to put the plot lower in the page
div(style = "margin-top:800px", plotOutput('plot2'))
})
output$plot2 <- renderPlot({
# another simple plot,
plot(sin, -pi, 2*pi)
})
})
))
Если вы считаете, что опция JavaScript работает для вас лучше, вы можете начать использовать библиотеку shinyjs, она включает в себя очень полезные функции, и вы можете легко добавить свой собственный код JavaScript в свои приложения Shiny.