R 闪亮的应用程序,制作一个自动向下滚动的日志
R shiny app, making a log that scrolls down automatically
我正在尝试使登录闪亮,其中的文本取自函数更新的反应值。日志在 verbatimTextOutput
中,我希望它在每次更新时都向下滚动。为此,我使用了一个函数,该函数使用了我发现 的 javascript 代码,但在控制台更新后立即使用时它不起作用,它实际上向下滚动到上次更新的级别(因为UI 值尚未更新?)。我尝试了不同的方法在不同的时间启动该功能,但无法将滚动条拉到底部。
这是我正在尝试的示例,我希望 "Add Text" 按钮一直向下滚动,但只有 "Force scroll update" 按钮可以:
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
extendShinyjs(text = "shinyjs.scrollDown = function() {
var objDiv = document.getElementById('log');
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
}"),
tags$style(HTML("#log {height:80px}")), br(),
verbatimTextOutput("log", placeholder = TRUE),
actionButton("add", "Add Text"),
actionButton("force", "Force scroll update")
)
server <- function(input, output, session) {
a <- reactiveValues(
logOutput = "TEST"
)
output$log <- renderText({ a$logOutput })
updateLog <- function(text){
a$logOutput <- paste(a$logOutput, text, sep = "\n")
}
observeEvent(input$add, {
updateLog("TEST")
js$scrollDown()
})
observeEvent(input$force,{
js$scrollDown()
})
}
shinyApp(ui = ui, server = server)
希望可以做到,谢谢
一个选项:
js <- "
$(document).on('shiny:value', function(evt){
if(evt.name == 'log'){
setTimeout(function(){
var objDiv = document.getElementById('log');
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
}, 500); // wait 500 milliseconds
}
});
"
ui <- fluidPage(
tags$head(
tags$script(HTML(js))
),
tags$style(HTML("#log {height:80px}")), br(),
verbatimTextOutput("log", placeholder = TRUE),
actionButton("add", "Add Text")
)
server <- function(input, output, session) {
a <- reactiveValues(
logOutput = "TEST"
)
output$log <- renderText({ a$logOutput })
updateLog <- function(text){
a$logOutput <- paste(a$logOutput, text, sep = "\n")
}
observeEvent(input$add, {
updateLog("TEST")
})
}
不拖延的解决方案,使用MutationObserver
:
js <- "
$(document).ready(function(){
var objDiv = document.getElementById('log');
// create an observer instance
var observer = new MutationObserver(function(mutations) {
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
});
// configuration of the observer
var config = {childList: true};
// observe objDiv
observer.observe(objDiv, config);
})
"
我正在尝试使登录闪亮,其中的文本取自函数更新的反应值。日志在 verbatimTextOutput
中,我希望它在每次更新时都向下滚动。为此,我使用了一个函数,该函数使用了我发现
这是我正在尝试的示例,我希望 "Add Text" 按钮一直向下滚动,但只有 "Force scroll update" 按钮可以:
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
extendShinyjs(text = "shinyjs.scrollDown = function() {
var objDiv = document.getElementById('log');
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
}"),
tags$style(HTML("#log {height:80px}")), br(),
verbatimTextOutput("log", placeholder = TRUE),
actionButton("add", "Add Text"),
actionButton("force", "Force scroll update")
)
server <- function(input, output, session) {
a <- reactiveValues(
logOutput = "TEST"
)
output$log <- renderText({ a$logOutput })
updateLog <- function(text){
a$logOutput <- paste(a$logOutput, text, sep = "\n")
}
observeEvent(input$add, {
updateLog("TEST")
js$scrollDown()
})
observeEvent(input$force,{
js$scrollDown()
})
}
shinyApp(ui = ui, server = server)
希望可以做到,谢谢
一个选项:
js <- "
$(document).on('shiny:value', function(evt){
if(evt.name == 'log'){
setTimeout(function(){
var objDiv = document.getElementById('log');
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
}, 500); // wait 500 milliseconds
}
});
"
ui <- fluidPage(
tags$head(
tags$script(HTML(js))
),
tags$style(HTML("#log {height:80px}")), br(),
verbatimTextOutput("log", placeholder = TRUE),
actionButton("add", "Add Text")
)
server <- function(input, output, session) {
a <- reactiveValues(
logOutput = "TEST"
)
output$log <- renderText({ a$logOutput })
updateLog <- function(text){
a$logOutput <- paste(a$logOutput, text, sep = "\n")
}
observeEvent(input$add, {
updateLog("TEST")
})
}
不拖延的解决方案,使用MutationObserver
:
js <- "
$(document).ready(function(){
var objDiv = document.getElementById('log');
// create an observer instance
var observer = new MutationObserver(function(mutations) {
objDiv.scrollTop = objDiv.scrollHeight - objDiv.clientHeight;
});
// configuration of the observer
var config = {childList: true};
// observe objDiv
observer.observe(objDiv, config);
})
"