user5249203
user5249203

Reputation: 4648

Shiny Column rendering error

This is a Q on the Column rendering example (4.4)provided in this link. http://rstudio.github.io/DT/options.html

I have implemented the example code described above to abbreviate character strings that are wider than 100 characters using the first 100 characters plus an ellipsis (…), and the full character string is displayed as a tooltip when you mouse over the cell. This works well as long as the column with custom rendering has full text in it. However, when it encounters an empty cell the table is not displayed and it shows " Processing..." on shiny browser. On disabling this custom rendering I am able to display the table with empty fields as expected. Did anyone had similar issue, any suggestion to overcome this ?

Below is my custom column rendering code.

output$PM_output <- DT::renderDataTable(
    expr =  DT::datatable(PubmedOutput(PubmedSearch()),
                          class   = 'cell-border stripe compact hover',
                          escape  = F, selection = 'multiple',
                          options = list(
                            initComplete = JS("function(settings, json) {",
                                "$(this.api().table().header()).css({
                                'background-color': '#303030',
                                'color': '#FFFF00'});","}"),
                            autoWidth  = T,
                            LengthMenu = c(5, 30, 50),
                             columnDefs = list(list(
                               targets  = 6,
                               render   = JS(
                                 "function(data, type, row, meta) {",
                                 "return type === 'display' && data.length > 100 ?",
                                 "'<span title=\"' + data + '\">' +
                                 data.substr(0, 100) + '...</span>' : data;", "}"))),
                            columnDefs = list(list(
                              targets  = c(1:8),
                              className = 'dt-center')),
                            pageLength = 1, server = T)))

The code that generate the Column 6 that I have passed custom rendering on.

PM.ID <- c("26391251","26372702","26372699","26371045") # does not output table
fetch.pubmed <- entrez_fetch(db = "pubmed", id = PM.ID,
                             rettype = "xml", parsed = T)
abstracts = xpathApply(fetch.pubmed, '//PubmedArticle//Article', function(x) xmlValue(xmlChildren(x)$Abstract))
abstracts #  ID 26372702, 26372699 has no abstract. and returns NA

Any inputs and suggestion. P.S: Is there a better way to display data other than ellipsis/ tooltip ? the code is too big to paste it all, hence picking only the parts where I noticed the issue. I hope it helps.

Upvotes: 1

Views: 1240

Answers (1)

Yihui Xie
Yihui Xie

Reputation: 30124

The condition data.length > 100 is not enough: you need to make sure data is a character string first. In your case, data may be null (converted from R's NA to JavaScript), and null.length will trigger an error. Replace

type === 'display' && data.length > 100

with a more rigorous condition:

type === 'display' && typeof data === 'string' && data.length > 100

Upvotes: 1

Related Questions