shiny.fluent: 在下拉列表中包含自定义 svg 图标

shiny.fluent: include custom svg icon in dropdown

有没有办法在 shiny.fluent R 包中重现 https://developer.microsoft.com/en-us/fluentui#/controls/web/icon 中使用自定义 svg 图标的示例?

这是我的 R 脚本,但它不起作用:

library(shiny)
library(shiny.fluent)

jscode <- "
registerIcons({
  icons: {
    'csv': (
      <svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 96 96' fill='#FFF' stroke-miterlimit='10' stroke-width='2'>
        <path stroke='#000000' d='M67.1716,7H27c-1.1046,0-2,0.8954-2,2v78 c0,1.1046,0.8954,2,2,2h58c1.1046,0,2-0.8954,2-2V26.8284c0-0.5304-0.2107-1.0391-0.5858-1.4142L68.5858,7.5858 C68.2107,7.2107,67.702,7,67.1716,7z'/>
        <path fill='#000000' d='M71 71h-3v-3h-.3173c-1.4089 2.3002-3.4822 3.45-6.22 3.45-2.0141 0-3.5908-.5062-4.7292-1.5187-1.1389-1.0125-1.708-2.3559-1.708-4.0312 0-3.5873 2.2244-5.6747 6.6742-6.2625l6.0621-.8063c0-3.2625-1.3891-4.8937-4.1664-4.8937-2.4357 0-4.6339.7875-6.5952 2.3625v-3.15c1.9874-1.2 4.278-1.8 6.8717-1.8C68.6236 51.35 71 53.7378 71 58.5125V71zM68 61.2422l-4.8242.6641c-1.4844.2085-2.6045.5762-3.3594 1.1035-.7554.5273-1.1328 1.4619-1.1328 2.8027 0 .9766.3481 1.7744 1.0449 2.3926.6963.6187 1.624.9277 2.7832.9277 1.5884 0 2.9004-.5566 3.9355-1.6699S68 64.9404 68 63.2344V61.2422zM80.1334 67l-3.252 10h-2.3781l2.3781-10H80.1334z'/>
        <path fill='none' stroke='#000000' d='M67,7v18c0,1.1046,0.8954,2,2,2h18'/>
        <path fill='#000000' d='M12,74h32c2.2091,0,4-1.7909,4-4V38c0-2.2091-1.7909-4-4-4H12c-2.2091,0-4,1.7909-4,4v32 C8,72.2091,9.7909,74,12,74z'/>
        <path d='M16.9492,66l7.8848-12.0337L17.6123,42h5.8115l3.9424,7.6486c0.3623,0.7252,0.6113,1.2668,0.7471,1.6236 h0.0508c0.2617-0.58,0.5332-1.1436,0.8164-1.69L33.1943,42h5.335l-7.4082,11.9L38.7168,66H33.041l-4.5537-8.4017 c-0.1924-0.3116-0.374-0.6858-0.5439-1.1215H27.876c-0.0791,0.2684-0.2549,0.631-0.5264,1.0878L22.6592,66H16.9492z'/>
      </svg>
    ) 
  },
});

const iconClass = mergeStyles({
  fontSize: 50,
  height: 50,
  width: 50,
  margin: '0 25px',
});"

ui <- fluidPage(
  tags$head(tags$script(type="module", HTML(jscode))),     
  tags$div(
    FontIcon(ariaLabel = "CSV logo", iconName = "csv", className = JS("iconClass"))
  )
)

server <- function(input, output, session) {
}

shinyApp(ui,server)

我想出了一个解决方案,参考 shiny.fluent 示例 Keytips

library(shiny)
library(shiny.fluent)

jscode <- "
jsmodule['@fluentui/react'].registerIcons({
  icons: {
    'csv': (
      React.createElement('svg', { xmlns: 'http://www.w3.org/2000/svg', viewBox: '0 0 96 96', fill: '#FFF', 'stroke-miterlimit': '10', 'stroke-width': '2' },
      React.createElement('path', { stroke: '#000000', d: 'M67.1716,7H27c-1.1046,0-2,0.8954-2,2v78 c0,1.1046,0.8954,2,2,2h58c1.1046,0,2-0.8954,2-2V26.8284c0-0.5304-0.2107-1.0391-0.5858-1.4142L68.5858,7.5858 C68.2107,7.2107,67.702,7,67.1716,7z' }),
      React.createElement('path', { fill: '#000000', d: 'M71 71h-3v-3h-.3173c-1.4089 2.3002-3.4822 3.45-6.22 3.45-2.0141 0-3.5908-.5062-4.7292-1.5187-1.1389-1.0125-1.708-2.3559-1.708-4.0312 0-3.5873 2.2244-5.6747 6.6742-6.2625l6.0621-.8063c0-3.2625-1.3891-4.8937-4.1664-4.8937-2.4357 0-4.6339.7875-6.5952 2.3625v-3.15c1.9874-1.2 4.278-1.8 6.8717-1.8C68.6236 51.35 71 53.7378 71 58.5125V71zM68 61.2422l-4.8242.6641c-1.4844.2085-2.6045.5762-3.3594 1.1035-.7554.5273-1.1328 1.4619-1.1328 2.8027 0 .9766.3481 1.7744 1.0449 2.3926.6963.6187 1.624.9277 2.7832.9277 1.5884 0 2.9004-.5566 3.9355-1.6699S68 64.9404 68 63.2344V61.2422zM80.1334 67l-3.252 10h-2.3781l2.3781-10H80.1334z' }),
      React.createElement('path', { fill: 'none', stroke: '#000000', d: 'M67,7v18c0,1.1046,0.8954,2,2,2h18' }),
      React.createElement('path', { fill: '#000000', d: 'M12,74h32c2.2091,0,4-1.7909,4-4V38c0-2.2091-1.7909-4-4-4H12c-2.2091,0-4,1.7909-4,4v32 C8,72.2091,9.7909,74,12,74z' }),
      React.createElement('path', { d: 'M16.9492,66l7.8848-12.0337L17.6123,42h5.8115l3.9424,7.6486c0.3623,0.7252,0.6113,1.2668,0.7471,1.6236 h0.0508c0.2617-0.58,0.5332-1.1436,0.8164-1.69L33.1943,42h5.335l-7.4082,11.9L38.7168,66H33.041l-4.5537-8.4017 c-0.1924-0.3116-0.374-0.6858-0.5439-1.1215H27.876c-0.0791,0.2684-0.2549,0.631-0.5264,1.0878L22.6592,66H16.9492z' }))
    ) 
  }
});

const iconClass = jsmodule['@fluentui/react'].mergeStyles({
  fontSize: 50,
  height: 50,
  width: 50,
  margin: '0 25px',
});"

ui <- fluidPage(
  tags$head(tags$script(HTML(jscode))),     
  tags$div(
    FontIcon(ariaLabel = "CSV logo", iconName = "csv", className = JS("iconClass"))
  )
)

server <- function(input, output, session) {
}

shinyApp(ui,server)

我们可以将 React.createElement 中的原始 svg 替换为

React.createElement('img', { src: '<image path>.svg',
            alt: 'CSV logo' })