R语言 在复选框中添加换行符组输入选项-闪亮

sxissh06  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(125)

我想在一个选项中添加换行符,因为它太长了。关于按钮标签的类似问题的答案是将字符串 Package 在HTML()中,但该解决方案似乎对choices不起作用。

简单示例代码

library(shiny)

choices_vector <- c(
  'Choice 1',
  HTML('Choice 2 shoulde be<br />on two lines'),
  'Choice 3'
)

ui <- fluidPage(
  checkboxGroupInput(
    inputId = 'choices_selec',
    label = '',
    choices = choices_vector
  )
)

server <- function(input, output) {}
shinyApp(ui = ui, server = server)

字符串

原始示例代码

这是较旧的示例代码,并且更复杂。这里留下它是因为一个答案使用了这个例子的许多细节。

ui <- fluidPage(
  splitLayout(cellWidths = c(170,80,160),
              tagList(uiOutput("example")))
)

server <- function(input, output) {
  choices_vector <- c("choice 1","choice 2",HTML("I want a line break here <br/> since the label is too long"),"choice 4")
  output$example <- renderUI({
    checkboxGroupInput(inputId = "choices_selec",
                       label = "", choices = choices_vector, selected = F)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)


我还尝试使用using paste0collapse(请参阅以下代码),并将uiOutput更改为htmlOutput,但结果是相同的

server <- function(input, output) {
  choices_vector <- c("choice 1","choice 2",paste0(c("I want a line break here ", "since the label is too long"), collapse = "<p/>"),"choice 4")
  output$example <- renderUI({
    checkboxGroupInput(inputId = "choices_selec",
                       label = "", choices = choices_vector, selected = F)
  })
}

tp5buhyn

tp5buhyn1#

问题是checkboxGroupInput只接受字符串作为choices。除非你修改Shiny的源代码否则我们什么都做不了试着跳出框框思考,为什么我们需要在R预处理级别上做这件事。我们可以使用js在客户端(浏览器)进行后处理。
下面是如何做的,像往常一样,但只需在复选框后添加这个非常简单的js代码:

library(shiny)
ui <- fluidPage(
  splitLayout(cellWidths = c(170,80,160),
              tagList(uiOutput("example")))
)

server <- function(input, output) {
  choices_vector <- c("choice 1"="c1","choice 2"="c2", "I want a line break here<br/> since the label is too long"="c3","choice 4"="c4")
  output$example <- renderUI({
    tagList(
      checkboxGroupInput(inputId = "choices_selec",
                         label = "", choices = choices_vector, selected = F),
      tags$script(
        "
        $('#choices_selec .checkbox label span').map(function(choice){
            this.innerHTML = $(this).text();
        });
        "
      )
    )
  })
  
  observe({
    print(input$choices_selec)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

字符串


的数据
此代码将允许您使用任何HTML标记作为字符串输入。呈现复选框后将分析HTML。
我还将名称添加到选择向量中,这样您就可以在服务器端更好地了解选择了哪些选项。

hlswsv35

hlswsv352#

choiceNames与选择

checkboxGroupInput()的文档说明:
使用[choiceNameschoiceValues]而不是命名列表进行选择的优点是,choiceNames允许通过任何类型的UI对象(标记对象,图标,HTML代码...),而不仅仅是简单的文本。
换句话说,这是可行的:

checkboxGroupInput(
    inputId = 'InputCorrect',
    label = 'Correct',
    choiceNames = list(
      'Choice 1',
      HTML('Choice 2 is<br />on two lines'),
      'Choice 3'
    ),
    choiceValues = 1:3,
  )

字符串
但这并不:

checkboxGroupInput(
    inputId = 'InputIncorrect',
    label = 'Incorrect',
    choices = list(
      'Choice 1',
      HTML('Choice 2 is<br />not on two lines'),
      'Choice 3'
    )
  )

不使用vector

在向choiceNames传递先前定义的列表时,需要记住的额外复杂性:
首先,**在定义choiceNames**时使用list()而不是c()。vector的元素必须是相同的类型。因此,c('A', HTML('B'), 'C')实际上没有任何HTML元素。另外,我认为R不支持HTML元素的向量。
其次,当手动将HTML()放入列表中不可行/不可取时,制作一个字符向量,然后使用lapply()将每个元素更改为HTML

choices_vector = c('Choice 1', 'Choice 2 is<br />not on two lines', 'Choice 3')
choices_vector = lapply(choices_vector, HTML)

工作示例

(Note使用lapply

library(shiny)

choices_vector = c(
  'Choice 1',
  'Choice 2 is<br />on two lines',
  'Choice 3'
)

ui = fluidPage(
  checkboxGroupInput(
    inputId = 'InputExistingList',
    label = 'Also correct',
    choiceNames = lapply(choices_vector, HTML),
    choiceValues = 1:length(choices_vector),
  )
)
server = function(input, output) {}
shinyApp(ui = ui, server = server)

相关问题