Гиперссылка для каждого фиксированного текста в столбце - PullRequest
1 голос
/ 02 апреля 2019

В приведенном ниже примере я должен поместить гиперссылку для каждой строки 'ID' в столбце 3. Однако приведенный ниже код циклически повторяется с sapply над каждой строкой столбца, и grepl возвращает TRUE или FALSE. Как я могу это исправить?

 shinyApp(
        shinyUI(
            fluidPage(
                dataTableOutput('PM_output')
            )
        ),
        shinyServer(function(input, output, session) {
            require(DT)
            dat <- read.table(text="Col1     Col2                  Col3
              Google   '5 lines description'   'ID273, ID288, ID299'
              Yahoo    '5 lines description'   'ID3, ID28, ID2'", header=T, strings=F)
            dat$Col3 <- sapply(grepl('ID',dat$Col3), function(x) 
                toString(tags$a(href=paste0("http://id=", x), x)))

            output$PM_output <- renderDataTable(expr = datatable(dat, escape=FALSE),
              options = list(autoWidth = T))
        })
    )

EDIT: Если Col3 что-то вроде:

    Col3
    'Name=ID273, ID288, ID299;'
    'Name=ID273;'

Как я могу исправить код таким образом, что только часть 'ID..' является гиперссылкой?

1 Ответ

1 голос
/ 02 апреля 2019

Вы можете просто paste0 для этого.Если вы используете вектор в paste, то элементы объединяются отдельно для каждого элемента в векторе.В этом примере я создал гиперссылку с lapply для каждого идентификатора в каждой строке, которая содержит хотя бы одну строку идентификатора.

Функции strsplit создают вектор строки идентификатора, разделенный на каждую запятую.Я добавил trimws для удаления пробелов вокруг идентификаторов.

Кроме того, вам нужно поместить опции в функцию datatable, и чтобы быть уверенным, что вы не используете функции shiny dataTableOutput и renderDataTable, я предпочитаю ставить DT::перед этими функциями.

Рабочий пример

library(DT)
library(shiny)

shinyApp(
  shinyUI(
    fluidPage(
      DT::dataTableOutput('PM_output')
    )
  ),
  shinyServer(function(input, output, session) {
    dat <- read.table(text="Col1     Col2                  Col3
              Google   '5 lines description'   'ID273, ID288, ID299'
              Yahoo    '5 lines description'   'ID3, ID28, ID2'", header=T, strings=F)
    dat$Col3[grepl('ID',dat$Col3)] = lapply(dat$Col3[grepl('ID',dat$Col3)], function(x)paste0("<a href=\"http://id=", trimws(unlist(strsplit(x, ',',fixed=T))), "\">", trimws(unlist(strsplit(x, ',',fixed=T))),"</a>"))

    output$PM_output <- DT::renderDataTable({
      datatable(dat, escape=FALSE, options = list(autoWidth = T))})
  })
)

Редактировать

Если я правильно понимаю, ваш запрошенный вывод для строки1:

"Name=<a href=\"http://id=ID273\">ID273</a>,<a href=\"http://id=ID288\">ID288</a>,<a href=\"http://id=ID299\">ID299</a>;"

Вы можете создать это с помощью:

dat <- read.table(text="Col1     Col2                  Col3
              Google   '5 lines description'   'Name=ID273, ID288, ID299;'
                  Yahoo    '5 lines description'   'Name=ID3, ID28, ID2;'", header=T, strings=F)
dat$Col3=lapply(gsub("Name=|;", "", dat$Col3[grepl('ID',dat$Col3)]), function(x)paste0("<a href=\"http://id=", trimws(unlist(strsplit(x, ',',fixed=T))), "\">", trimws(unlist(strsplit(x, ',',fixed=T))),"</a>", collapse=','))
dat$Col3=paste0('Name=',dat$Col3,';')
...