创建超链接文本,返回在应用程序内单击作为输入的文本

时间:2015-09-01 14:23:55

标签: r shiny

我正在处理一个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)

非常感谢您的帮助和建议。

1 个答案:

答案 0 :(得分:2)

我认为这些修改应该可以解决问题:

  1. 将链接标记结构更改为:
  2. <a href='#' onclick='detect_click(this)'>text</a>

    1. 在同一文件夹中创建一个名为detect_click.js的Javascript文件(虽然可以命名)。将以下代码放在文件中:
    2. function detect_click(el) { Shiny.onInputChange('clicked_text', el.innerHTML); }

      1. 更改用户界面以阅读Javascript文件:
      2. ui <- fluidPage( htmlOutput("markup"), textOutput("clicked_text"), includeScript("detect_click.js") )

        1. 现在在服务器中,您可以使用input $ clicked_text,就好像它是任何普通的Shiny输入一样 - 创建被动对象并正常输出,并且只要点击上面用标签结构创建的链接,它就会改变