我正在处理一个Shiny项目,其中我想在Shiny应用程序中呈现文本并使该文本中的每个单词成为超链接,单击该链接时将单击的文本作为输入发送到应用程序内的另一个功能。
以下是我目前使用的玩具示例,该示例仅尝试获取超链接的单词以触发reactiveEvent
并呈现单击的文本。假设我的渲染文字在data
。我在data
中标记文本,并将结果作为HTML输出到markup
。理想情况下,当我点击超链接的单词'This'时,clicked_text
输出会显示文本'This'。
我用于标记的actionLink语法有两个问题:1)只有第一个超链接的单词触发input$clicked_text
和2)input$clicked_text
的值是一个整数,记录了超链接的次数被点击了。
library(shiny)
ui <- fluidPage(
htmlOutput("markup"),
textOutput("clicked_text")
)
# sample data
data <- c("This", "is", "a", "sentence")
# function to markup text
markup.text <- function(data) {
markup <- lapply(data, function(text) {
paste0("<a id = 'clicked_text' href = '#' class = 'action-button shiny-bound-input' value = '",
text,
"'>",
text,
"</a>")
}) %>%
paste(collapse = " ")
return(markup)
}
server <- function(input, output) {
output$markup <- renderUI({ # display the marked-up text
HTML(markup.text(data))
})
output$clicked_text <- eventReactive(input$clicked_text, { # display clicked text output
input$clicked_text
})
}
shinyApp(ui = ui, server = server)
非常感谢您的帮助和建议。
答案 0 :(得分:2)
我认为这些修改应该可以解决问题:
<a href='#' onclick='detect_click(this)'>text</a>
function detect_click(el) {
Shiny.onInputChange('clicked_text', el.innerHTML);
}
ui <- fluidPage(
htmlOutput("markup"),
textOutput("clicked_text"),
includeScript("detect_click.js")
)