如何在 R Shiny 应用程序中实现和显示带有可点击单词的句子?

How to implement and display sentences with clickable words in R Shiny application?

我设计了一个闪亮的应用程序,其功能之一是从基础语料库生成新句子(通过马尔可夫字符串)。假设我生成了 10 个长度适中的句子。

sentences <— c(rep(c("This is a test sentence of moderate length", "This is another test sentence of moderate length"),5))

我希望能够在我的 Shiny 应用程序中非常清楚地显示这些句子,每行一个,允许一点交互。特别是,我希望这些词可以在 plotly_click 模型(cf plotly 包)上点击,以便使用点击词作为其他操作的输入。

理想情况下,以一种附加但次要的方式,我什至希望用户可以手动替换这些词。

到目前为止,我已经研究了不同的闪亮组件(闪亮的基础、htmlwidgets、plotly 等),但没有找到令人满意的解决方案,我依赖你的想法和建议,

非常感谢

这是一种仅使用显示多个句子的基本 Shiny 函数来实现应用程序的可能方法,单击每个单独的单词会创建一个仅包含该单词的新输入,然后可以将其用于其他计算或进程。

我所做的是手动创建负载 HTML 超链接标签包裹每个单词,并使用 Shiny.setInputValue Javascript 函数创建一个新的 Shiny 输入可调用input$word 每当用户点击给定的单词时。为了证明已经创建了一个可以在其他地方使用的新输入,我刚刚使用 renderText 将其打印在主列表下方 - 你会看到每当你点击不同的词时, textOutput 更新以打印点击的单词:

library(shiny)

ui <- fluidPage(
    uiOutput("sentences"),
    br(),br(),
    textOutput("word")
)

server <- function(input, output) {

    sentences <- c(rep(c("This is a test sentence of moderate length", "This is another test sentence of moderate length"),5))
    
    output$sentences <- renderUI({
        link_sentences <- lapply(sentences, function(x) {
            words <- unlist(strsplit(x, " ", fixed = TRUE))
            sentence <- paste0("<a href='#' onclick='Shiny.setInputValue(\"word\", \"", words, "\");'>",
                              words,
                              "</a>",
                              collapse = "",
                              sep = " ")
            HTML(paste("<br>", sentence, "</br>"))
        })
        do.call(tagList, link_sentences)
    })
    
    output$word <- renderText(input$word)
}

shinyApp(ui = ui, server = server)

一种选择是将句子作为数据处理table

library(shiny)
library(DT)
library(plyr)

ui <- fluidPage(
    # Original sentences as a table
    DT::dataTableOutput('tableId'),
    # Show the selected word(s) separately 
    textOutput("text")
)

server <- function(input, output) {
    sentences <-  reactive({
        orig_sentences <- c(rep(c("This is a test sentence of moderate length", "This is another with different length"),5))
        # Split sentences on whitespace, make a table with plyr 
        t <- ldply(t(strsplit(orig_sentences, " ")), rbind)
    })

    output$tableId <- DT::renderDataTable(
        sentences(), selection = list(target = 'cell')
    )
    
    output$text <- renderText({
        # Get the selected cell(s) and get the cell value accordingly
        cell <- input$tableId_cells_selected
        sentence <- sentences()[cell]
    })
}

shinyApp(ui = ui, server = server)

table 不是最漂亮的解决方案。 reader 更友好,但不是那种编程上优雅的方式是在每个单元格上都有完整的句子。从句子 table 中选择一个单元格可以使用所选句子中的单词作为单元格来填充新数据 table。

关于你问题的第二点:如果你想替换单词,你可以将句子存储为 reactiveValues 并制作你自己的替换函数来存储从 textInput 到选定的单元格 .