2017-06-15 306 views
2

我有一個來自DT包的數據表,其中包含多列,其中一列包含URL。有沒有一種方法可以讓這些URL顯示爲用戶可以在Shiny應用程序中單擊的超鏈接?另外,如果URL長得令人難以置信(比如隨機谷歌搜索是第四項),那麼只顯示前25個字符而不會破壞超鏈接的功能?閃亮 - 在數據表中顯示URL

一些示例代碼如下。

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) 

更新:基於從瑞安莫頓建議的帖子,我試圖適應代碼。我的問題是現在用戶創建的createLink函數中包含的sprintf函數。鏈接按鈕出現,但沒有去所需的位置。

#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) 
+0

這是類似的:https://stackoverflow.com/questions/28117556/clickable-links-in-shiny-datatable –

+0

@RyanMorton接近於以及具有按鈕爲紐帶,將解決我的問題很長的URL。看起來鏈接是使用sprintf函數創建的,該函數在函數文檔的初始研究中只是格式化文本以用於鏈接的一種方式。我相信這是創建鏈接的href函數,但那正是我掙扎的地方,將這個答案調整爲使用href,它將現有的現有網址作爲當前的字符串,並將其設置爲超鏈接。 – User247365

回答

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()粘貼鏈接。

+0

這工作很好!有沒有什麼方法可以替代顯示前25個字符,而是按照Ryan Morton在評論中發佈的帖子創建按鈕?我現在正在貪婪,因爲你提供的答案完美無缺,正如我在原始文章中所提到的那樣:) – User247365

+0

現在你已經有兩種方法了,我想你現在應該怎麼操作ifelse();) – BigDataScientist