【问题标题】:NSE on shiny.tagShiny.tag 上的 NSE
【发布时间】:2018-01-29 11:38:40
【问题描述】:

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

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

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>

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

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

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

尝试将文本分类器直接推入 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

有什么建议吗?

【问题讨论】:

    标签: r shiny nse


    【解决方案1】:

    我认为您可以为此使用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"
    

    希望这会有所帮助!

    【讨论】:

    • 是的。 tag 是我正在寻找的命令。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2019-11-20
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多