0

假设我有以下标签:

library(htmltools)

t = div(name = 'oldname')

t$attribs$name = 'newname'我可以使用但更喜欢使用htmltoolsgetters/setters覆盖此标签的“名称”属性,该包是否具有促进此功能的功能?

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

t = tagAppendAttributes(t, name = 'newname')
t
#<div name="oldname newname"></div>

没有覆盖属性值的辅助函数是否意味着标签属性不应该被覆盖?

4

1 回答 1

0

你可能想多了。查看以下代码tagAppendAttributes

tagAppendAttributes
#> function (tag, ...) 
#> {
#>     tag$attribs <- c(tag$attribs, list(...))
#>     tag
#> }

它所做的只是将您传递的任何内容直接写入tag$attribs. 如果你是unclass你的对象,你会发现它实际上只是一个列表:

unclass(t)
#> $name
#> [1] "div"
#>
#> $attribs
#> $attribs$name
#> [1] "oldname"
#> 
#> 
#> $children
#> list()

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

如果你真的想我想你可以定义一个二传手:

tagSetAttributes <- function(tag, ...) {tag$attribs <- list(...); tag}
tagSetAttributes(t, name = "new name")
#> <div name="new name"></div>
于 2020-06-25T13:01:39.063 回答