Quiero generar hipervínculos a partir de mis valores de tabla de datos. Encontré esta solución Cómo crear un hipervínculo al valor de la celda en R brillante y era perfecta, pero era solo para una columna. Ahora también necesito una alternativa donde los hipervínculos estén en todas las columnas. Al poner targets = "_all"
en columnDefs
, hice un hipervínculo en cada celda, pero mi problema es que si hago clic en ese valor de celda (por ejemplo, en LPE(18:1)
), el enlace generado se compone de cada valor en esa fila . Creo que la solución es pasar el índice de fila y columna a la función de representación, pero no tengo idea de cómo hacerlo. He aquí un ejemplo reproducible.
library(shiny) data_input <- data.frame( List = c("Cer(d18:1/16:0)", "DGDG(16:0/18:0)", "PS(18:0/18:1)"), Feature = c("LPE(18:1)", "LPE(20:4)",NA ), Location = c("MGDG(16:0/18:0)", "MGDG(18:0/18:0)" , "TG(18:1/18:1/18:1)") ) render <- c( "function(data, type, row){", " if(type === 'display'){", " var a = '<a href=\"http://www.swisslipids.org/#/search/' + row + '\">' + data + '</a>';", " return a;", " } else {", " return data;", " }", "}" ) 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(data_input, rownames = T, options = list( columnDefs = list( list(targets = "_all", render = JS(render)), list(targets = "_all", className = "dt-center") ) ) ) }) } shinyApp(ui, server)
Además, de forma predeterminada, si el valor de una celda es NA, esa celda en la tabla de datos estará en blanco, pero en este caso se escribe null
y también tiene un hipervínculo. ¿Hay alguna solución para no generar un hipervínculo para esas celdas? ¿Solo quiero que permanezcan en blanco?
@Stéphane Laurent sabrá mejor que yo, pero podría probar esto como su renderizador JS. Puede verificar si data
son NULL si su declaración if
, y probablemente debería incluir data
en su referencia de hipervínculo en lugar de "fila". Pruebe esto y déjeme saber si esto ayuda.
render <- c( "function(data, type, row){", " if(type === 'display' && data){", " var a = '<a href=\"http://www.swisslipids.org/#/search/' + data + '\">' + data + '</a>';", " return a;", " } else {", " return data;", " }", "}" )
Editar : si tiene "Cer (d18: 1_16: 0) + OH" como entrada en una celda, pero desea usar "Cer (d18: 1/16: 0)" en su enlace, puede usar la función de replace
y encadenarlos para múltiples reemplazos. En este caso, use /g para el modificador global. Puede ajustar la expresión regular para sus necesidades particulares.
render <- c( "function(data, type, row){", " if(type === 'display' && data){", " var newstr = data.replace(/_/g, '/').replace(/\\).*/g, ')');", " var a = '<a href=\"http://www.swisslipids.org/#/search/' + newstr + '\">' + data + '</a>';", " return a;", " } else {", " return data;", " }", "}" )