Вы можете прослушивать изменения DOM с помощью javascript: Есть ли прослушиватель изменений DOM JavaScript / jQuery? .
Когда происходит изменение, вы можете проверить, есть ли у вашего целевого элемента текст:
hasText = document.getElementById("text_to_mark").innerHTML != ""
Обратите внимание, что я предполагаю, что ваш элемент имеет идентификатор "text_to_mark".
результат, который вы можете «отправить в R» с помощью
Shiny.onInputChange("hasText", hasText);
На стороне R вы узнаете, есть ли у элемента текст при прослушивании input$hasText
.
Таким образом, вы можете добавить:
observeEvent(input$hasText,{
...
})
JavaScript, который вы можете добавить в свое приложение с помощью tags$script(jsCode)
или использовать shinyjs
.
Воспроизводимый пример:
library(shiny)
library(marker)
jsCode <- '
MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
var observer = new MutationObserver(function(mutations, observer) {
console.log(mutations, observer);
hasText = document.getElementById("text_to_mark").innerHTML != ""
Shiny.onInputChange("hasText", hasText);
});
observer.observe(document, {
subtree: true,
attributes: true
});
'
ui <- fluidPage(
use_marker(),
tags$script(jsCode),
actionButton("click", "click"),
textOutput("text_to_mark"),
actionButton("mark", "Mark!")
)
server <- function(input, output) {
observeEvent(input$click, {
output$text_to_mark <- renderText("My house is yellow")
})
observeEvent(input$hasText,{
marker <- marker$new("#text_to_mark.shiny-text-output.shiny-bound-output")
marker$
unmark()$ # unmark all before we mark
mark("My house")
})
}
# Run the application
shinyApp(ui = ui, server = server)
Обратите внимание, что это работает только при первом появлении текста. Если вы также хотите прослушать изменения текста, можно вместо этого отправить текст в R и проверить на стороне R, был ли текст обновлен. Не уверен, нужен ли он здесь.