shiny.tag 上的 NSE

NSE on shiny.tag

一个奇怪的用例:我试图允许更改闪亮标签上的文本说明符,同时保留 shiny.tag。

例如,这是我想要的输出:

library(htmltools)
library(rlang)
tags$a("boom")
#> <a>boom</a>

注意这是一个闪亮的标签:

class(tags$a("boom"))
#> [1] "shiny.tag"

我想做的是能够改变分配给文本的 HTML 代码(例如,分配 h2 而不是 a。我想做这使用 NSE 并且需要输出保持 shiny.tag,而不是转换为字符(所以所有的粘贴黑客都没有了)。

这是我已经达到的程度,但似乎无法让它发挥作用:

library(htmltools)
library(rlang)

textSorter <- function(c="a",text) {
  c=enquo(c)
  tags$p(UQE(c),text)
}

a <- textSorter(c = "h2",text="Success?")
a
#><p>
#>  h2
#>  Success?
#></p>

所以这很接近...至少我可以将标签放入输出...但是有 2 个问题,显然,h2 只是文本,而不是所需的包装函数(p ), 有趣的是:

class(a)
#>Error in tags$UQE(c) : attempt to apply non-function

输出神秘地没有 class,但仍然以某种方式保留它的 NSE?

尝试将文本 classifier 直接推入 tags$ 参数产生:

textSorter <- function(c="a(",text) {
  c=enquo(c)
  tags$UQE(c)(text)
}

textSorter(c = "h2",text="Success?")
}
#> Error in textSorter(c = "h2", text = "Success?") : 
#>   attempt to apply non-function

有什么建议吗?

我认为你可以为此使用 tag 函数:

textSorter <- function(c1="a",text) {
  tag(c1,text)
}
x=textSorter('h2','hello')

测试它是否按预期工作:

print(x)
<h2>hello</h2>

class(x)
[1] "shiny.tag"

利用这些信息,也可以轻松更改现有 shiny.tag:

的标签
x = tags$a('hello!')
changeTag <- function(x,y='a')
{
  tag(y,x$children)
}
y <- changeTag(x,'p')

再次验证:

print(y)
<p>hello!</p>
class(y)
[1] "shiny.tag"

希望对您有所帮助!