【问题标题】:R: Conditionally including a named element in a listR:有条件地在列表中包含命名元素
【发布时间】:2018-09-11 19:15:55
【问题描述】:

因为 Shiny 中包含的 checkboxGroup 并不完全符合我的需要,所以我正在重建 checkboxGroup 函数。我正在寻找一种方法,根据布尔变量在传递给 tags$input(...) 的参数中包含一个名为 checked 的元素。

我希望以下代码能按预期工作,但我明白为什么它不能也不应该。有没有类似的简洁语法可以用来达到预期的效果?

f <- function(selected = TRUE) {
  tags$input(
    type = 'checkbox',
    if(selected) checked = "checked",
    "Checkbox Content"
  )
}

f()
# actual result:
# <input type="checkbox">
#   checked
#   Checkbox Content
# </input>

# desired result:
# <input type="checkbox" checked = "checked">
#   Checkbox Content
# </input>

【问题讨论】:

  • 我不太明白,但你不能用renderUI吗?
  • 否则,无论如何,你应该这样做tags$input(type = 'checkbox', checked = if(selected) "checked", "Checkbox Content")
  • 困境是如果checked被包含为一个命名参数,它会导致复选框被选中。见stackoverflow.com/questions/12700626/…

标签: html r list if-statement


【解决方案1】:

有条件地为函数调用添加参数并不容易,但你可以这样做

f <- function(selected = TRUE) {
  tag <- tags$input(
    type = 'checkbox',
    "Checkbox Content"
  )
  if (selected) tag <- tagAppendAttributes(tag, selected=TRUE)
  tag
}

f(TRUE)
# <input type="checkbox" selected="TRUE">Checkbox Content</input>
f(FALSE)
# <input type="checkbox">Checkbox Content</input>

【讨论】:

  • 谢谢。这就是我的想法。如果没有人可以提供更“内联”或更简单/简洁的答案,我会接受这个答案。
  • @ctesta01 我能想到的另一种方法是将所有参数构建到一个列表中并使用do.call 调用该函数。 MrFlick 的解决方案更简洁。
猜你喜欢
  • 2017-02-20
  • 1970-01-01
  • 2021-06-30
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 2022-07-01
  • 1970-01-01
  • 2021-07-16
相关资源
最近更新 更多