首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >htmltools中的变量访问::withtag

htmltools中的变量访问::withtag
EN

Stack Overflow用户
提问于 2016-04-15 09:49:19
回答 1查看 771关注 0票数 1

为什么以下不打印“名称(数据)”的表第四元素?元素保持空。有趣的是,tr-部分中的lapply似乎没有任何问题。

代码语言:javascript
复制
data <- data.frame(a = 1, b = 2)

htmltools::withTags(table(
  class = 'display',
  thead(
    tr(
      th(rowspan = 2, "Test1"),
      th(rowspan = 2, "Test2"),
      th(rowspan = 2, "Test3"),
      th(colspan = 2, names(data)[1]),
      th(colspan = 2, names(data)[2])
    ),
    tr(
      lapply(rep(c('Abs', 'Change'), 2), th)
    )
  )
))

给予:

代码语言:javascript
复制
<table class="display">
  <thead>
    <tr>
      <th rowspan="2">Test1</th>
      <th rowspan="2">Test2</th>
      <th rowspan="2">Test3</th>
      <th colspan="2"></th> ## Why empty???
      <th colspan="2"></th> ## Why empty???
    </tr>
    <tr>
      <th>Abs</th>
      <th>Change</th>
      <th>Abs</th>
      <th>Change</th>
    </tr>
  </thead>
</table>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-15 10:53:14

这是evalsubstitute组合造成的一个问题。让我们看一下withTags命令:

代码语言:javascript
复制
> htmltools::withTags
function (code) 
{
    eval(substitute(code), envir = as.list(tags), enclos = parent.frame())
}
<environment: namespace:htmltools>

它在这个嵌套的计算框架内调用代码。现在,我们可以简单地分析一下有趣的部分:

代码语言:javascript
复制
> eval(substitute(names(data)[1]), envir = as.list(tags))
NULL

这就是导致th标记保持空的原因。现在,,为什么会发生这种情况?

代码语言:javascript
复制
> names(htmltools::tags)
  [1] "a"           "abbr"        "address"     "area"        "article"    
  [6] "aside"       "audio"       "b"           "base"        "bdi"        
 [11] "bdo"         "blockquote"  "body"        "br"          "button"     
 [16] "canvas"      "caption"     "cite"        "code"        "col"        
 [21] "colgroup"    "command"     "data"        "datalist"    "dd"         
 [26] "del"         "details"     "dfn"         "div"         "dl"         
 [31] "dt"          "em"          "embed"       "eventsource" "fieldset"   
 [36] "figcaption"  "figure"      "footer"      "form"        "h1"         
 [41] "h2"          "h3"          "h4"          "h5"          "h6"         
 [46] "head"        "header"      "hgroup"      "hr"          "html"       
 [51] "i"           "iframe"      "img"         "input"       "ins"        
 [56] "kbd"         "keygen"      "label"       "legend"      "li"         
 [61] "link"        "mark"        "map"         "menu"        "meta"       
 [66] "meter"       "nav"         "noscript"    "object"      "ol"         
 [71] "optgroup"    "option"      "output"      "p"           "param"      
 [76] "pre"         "progress"    "q"           "ruby"        "rp"         
 [81] "rt"          "s"           "samp"        "script"      "section"    
 [86] "select"      "small"       "source"      "span"        "strong"     
 [91] "style"       "sub"         "summary"     "sup"         "table"      
 [96] "tbody"       "td"          "textarea"    "tfoot"       "th"         
[101] "thead"       "time"        "title"       "tr"          "track"      
[106] "u"           "ul"          "var"         "video"       "wbr"  

如您所见,data是标记之一,因此它是环境中包含的命令之一。现在,使用这组新变量对命令进行计算。毫不奇怪:

代码语言:javascript
复制
> names(htmltools::tags$data)
NULL

这就是这种奇怪行为的原因。我引用这里的话

备注 代用品完全是在词汇的基础上工作的。不能保证结果表达式有任何意义。

至于避免,这种行为:只需将您的data.frame、data1或任何不能被误认为html标记的名称命名即可。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36643788

复制
相关文章

相似问题

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