Блестящий - отображаемый URL-адрес в таблице данных

У меня есть таблица данных из пакета DT, которая содержит несколько столбцов, один из которых содержит URL-адреса. Есть ли способ заставить эти URL-адреса отображаться в виде гиперссылок, по которым пользователь может щелкнуть внутри приложения Shiny? Кроме того, может ли быть так, что если URL-адрес невероятно длинный (например, случайный поиск Google, который является 4-й записью), отображаются только первые 25 символов, не нарушая функциональность гиперссылки?

Пример кода ниже.

require(DT)
require(shiny)

web_names <- c("google", "yahoo", "Stack Overflow", "Random Google Search")
url <- c( "https://www.google.com/", "https://www.yahoo.com/", "https://stackoverflow.com/", "https://www.google.com/search?q=random+google+search&oq=random+google+search&aqs=chrome..69i57j0l5.3264j0j7&sourceid=chrome&ie=UTF-8")
websites <- data.frame(web_names, url)

ui <- fluidPage(
  DT::dataTableOutput("websitesTable")
)


server<-function(input,output,session) {
output$websitesTable <- DT::renderDataTable({datatable({websites})})
}

shinyApp(ui=ui, server=server)

ОБНОВЛЕНИЕ: Основываясь на предложенном сообщении от Райана Мортона, я попытался адаптировать код. Моя проблема теперь заключается в функции sprintf, содержащейся в созданной пользователем функции createLink. Кнопка ссылки появляется, но не переходит в нужное место.

#app.R#

library(shiny)

web_names <- c("google", "yahoo", "Stack Overflow", "Random Google Search")
url <- c( "https://www.google.com/", "https://www.yahoo.com/", "https://stackoverflow.com/", "https://www.google.com/search?q=random+google+search&oq=random+google+search&aqs=chrome..69i57j0l5.3264j0j7&sourceid=chrome&ie=UTF-8")
websites <- data.frame(web_names, url)
createLink <- function(val) {
  sprintf('<a href="" target="_blank" class="btn btn-primary">Info</a>', val)
}

websites$url_link <- createLink(websites$url)

ui <- fluidPage(  
  titlePanel("Table with Links!"),
  sidebarLayout(
    sidebarPanel(
      h4("Click the link in the table to go to the url listed.")
    ),
    mainPanel(
      dataTableOutput('table1')
    )
  )
)

server <- function(input, output) {

  output$table1 <- renderDataTable({ datatable({websites})
    return(websites)

  }, escape = FALSE)
}

shinyApp(ui, server)

person User247365    schedule 15.06.2017    source источник


Ответы (1)


Слегка скорректируйте предоставленный код, и он должен дать желаемый результат:

createLink <- function(val) {
  sprintf(paste0('<a href="', URLdecode(val),'" target="_blank">', substr(val, 1, 25) ,'</a>'))
}
websites$url <- createLink(websites$url)

HTML работает следующим образом: <a href="LINK", otherOptions,...> Linktext </a> Таким образом, вы можете вставить свою ссылку вместе с paste0() и substr().

person Tonio Liebrand    schedule 15.06.2017
comment
Это прекрасно работает! Есть ли способ, чтобы вместо отображения первых 25 символов была создана кнопка, похожая на сообщение, которое Райан Мортон разместил в комментариях? Я сейчас жадный, потому что ответ, который вы предоставили, отлично работает, как я и просил в своем исходном сообщении :) - person User247365; 15.06.2017
comment
Теперь у вас есть оба подхода, и я думаю, теперь вы знаете, как работает ifelse();) - person Tonio Liebrand; 15.06.2017
comment
Мне нужно было использовать некоторую if - else логику, чтобы иметь дело с отсутствующими URL-адресами или URL-адресами нулевой длины. - person jsta; 07.05.2018