Quais os riscos do uso da função HTML()?

Antes de tudo, olhei o risco do uso de HTML em um aplicativo shiny, mas pouco entendi sobre ele.

Considere este objeto de classe shiny.tag:

    tags$li(
      class = "dropdown",
      tags$a(
        height = 40, href = "https://www.instagram.com/instagram",
        title = "Instagram", target = "_blank",
        tags$strong(
          icon("instagram"), ""
        )
      )
    )

E, rodando-a no Console, temos o seguinte HTML:

<li class="dropdown">
      <a style="height:40px" href="https://www.instagram.com.br" title="Instagram" 
target="_blank">
      <strong>
      <i class="fas fa-instagram"></i>
      </strong>
      </a>
      </li>

Elas seriam equivalentes, exceto pela classe. Na primeira, temos:

[1] "shiny.tag"

Enquanto que o código HTML apresenta:

[1] "html"      "character"

Eu tentei substituir o objeto de classe shiny.tag por um HTML dentro de da função shinydashboard::dashboardHeader() como segue:

header <- dashboardHeader(

title = "Dashboard", 
titleWidth = 300, 

  HTML(
    '<li class="dropdown">
      <a style="height:40px" href="https://www.google.com.br" title="Entre em contato" 
target="_blank">
      <strong>
      <i class="fas fa-whatsapp"></i>
      </strong>
      </a>
      </li>'
  )

)

Mas, o seguinte erro aparece:

Error in FUN(X[[i]], …) : Expected an object with class ‘shiny.tag’.

Bom, sabe-se que as classes são diferentes, mas eu tenho outras funções no meu aplicativo, que consegui fazer a conversão para um HTML onde continha este mesmo problema/ erro, mas, aqui no sidebarHeader não está funcionando.

Pode parecer (ou talvez seja mesmo) uma “paranoia” minha - “Poxa, se funcionou com a shiny.tag, pra que tentar converter para HTML sabendo que seu uso é contraindicado?”.

Eu uso muito HTML no meu app e, gostaria de obter como resposta (se possível):

  • Em quais contextos o uso de HTML pode ser prejuducial?

  • Por que é indicado converter um código HTML em R em um shinyApp, como por exemplo com uso do pacote html2R?

  • Como fazer este o objeto de classe HTML funcionar dentro do sidebarHeader(). Meu app para auxílio nesta questão:

    library(shiny)
    library(shinydashboard)
    
    header <- dashboardHeader(
    
    title = "Dashboard", 
    titleWidth = 300, 
    
    HTML(
      '<li class="dropdown">
        <a style="height:40px" href="https://www.instagram.com.br" title="Instagram" target="_blank">
        <strong>
        <i class="fas fa-instagram"></i>
        </strong>
        </a>
        </li>'
    )
    
    )
    
    sidebar <- dashboardSidebar(
    
    width = 300
    
    )
    
    body <- dashboardBody(
    
    uiOutput(
      outputId = "hour"
    )
    
    )
    
    ui <- dashboardPage(
    
    header = header, 
    sidebar = sidebar, 
    body = body
    
    )
    
    server <- function(input, output) {
    
    
    
    }
    
    shinyApp(ui, server)

Giovani,

Como comentado no livro, a função HTML() serve para usar tags de formatação dentro de strings:

library(shiny)
library(htmltools)

# Não funciona
div("Hello <u>World</u>")
#> <div>Hello &lt;u&gt;World&lt;/u&gt;</div>

# Funciona
div(HTML("Hello <u>World</u>"))
#> <div>Hello <u>World</u></div>

Created on 2022-02-08 by the reprex package (v2.0.1)

Se você não precisar formatar uma parte de uma string, então não há muito motivo para preferir a HTML(). Na minha concepção, é preferível usar shiny tags porque você pode manipular o código HTML como um objeto do R, com argumentos e assim por diante; como você mesmo disse, o livro recomenda usar a função HTML() o mínimo possível.

Logo depois, o próprio livro já alerta sobre o tipo de problema que você encontrou. Usar HTML() vai te impedir de utilizar funções que esperam shiny tags:

Doing so, you will not be able to use tags related functions, as in the next parts.

Resumindo:

  1. Quando o HTML() pode ser prejudicial? Em teoria, ele não vai prejudicar nada, só dificultar a sua vida.

  2. Por que converter HTML em shiny tags? Com código R sempre vai ser mais fácil manipular as coisas, desde argumentos até reutilização de pedaços.

  3. Como usar HTML() dentro do sidebarHeader()? Não consegui encontrar um jeito, então estou achando que esse é um dos casos em que as shiny tags são necessárias.

1 curtida