假设我有以下标签:
library(htmltools)
t = div(name = 'oldname')我可以用t$attribs$name = 'newname'覆盖这个标签的'name‘属性,但是更喜欢使用htmltools getter/setters,包是否有一个函数来帮助这个??
纵观包手册,唯一允许操作标记属性的函数是tagAppendAttributes,它只将新的atrribute值附加到原始文件:
t = tagAppendAttributes(t, name = 'newname')
t
#<div name="oldname newname"></div>如果没有覆盖属性值的助手函数,是否意味着标记属性不是要被覆盖的?
发布于 2020-06-25 13:01:39
你可能想得太多了。查看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类中的“公共”数据成员。直接设置它并不比任何其他实现更有可能破坏它。
如果您真的想这样做,我想您可以定义一个setter:
tagSetAttributes <- function(tag, ...) {tag$attribs <- list(...); tag}
tagSetAttributes(t, name = "new name")
#> <div name="new name"></div>https://stackoverflow.com/questions/62575509
复制相似问题