首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换htmltools::tag的属性值

替换htmltools::tag的属性值
EN

Stack Overflow用户
提问于 2020-06-25 12:36:19
回答 1查看 130关注 0票数 0

假设我有以下标签:

代码语言:javascript
复制
library(htmltools)

t = div(name = 'oldname')

我可以用t$attribs$name = 'newname'覆盖这个标签的'name‘属性,但是更喜欢使用htmltools getter/setters,包是否有一个函数来帮助这个?

纵观包手册,唯一允许操作标记属性的函数是tagAppendAttributes,它只将新的atrribute值附加到原始文件:

代码语言:javascript
复制
t = tagAppendAttributes(t, name = 'newname')
t
#<div name="oldname newname"></div>

如果没有覆盖属性值的助手函数,是否意味着标记属性不是要被覆盖的?

EN

回答 1

Stack Overflow用户

发布于 2020-06-25 13:01:39

你可能想得太多了。查看tagAppendAttributes的代码

代码语言:javascript
复制
tagAppendAttributes
#> function (tag, ...) 
#> {
#>     tag$attribs <- c(tag$attribs, list(...))
#>     tag
#> }

它所做的就是把你传递的任何东西直接写到tag$attribs上。如果您unclass您的对象,您将看到它只是一个列表,真的:

代码语言:javascript
复制
unclass(t)
#> $name
#> [1] "div"
#>
#> $attribs
#> $attribs$name
#> [1] "oldname"
#> 
#> 
#> $children
#> list()

我可以理解为什么直接写入对象的数据成员,而不是使用setter,如果您来自面向对象的编程背景,可能会感到不正确,但这显然是非正式S3类中的“公共”数据成员。直接设置它并不比任何其他实现更有可能破坏它。

如果您真的想这样做,我想您可以定义一个setter:

代码语言:javascript
复制
tagSetAttributes <- function(tag, ...) {tag$attribs <- list(...); tag}
tagSetAttributes(t, name = "new name")
#> <div name="new name"></div>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62575509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档