【问题标题】:DT package not working with blogdown using hugo-future-imperfect themeDT 包不适用于使用 hugo-future-imperfect 主题的 blogdown
【发布时间】:2017-09-21 11:40:07
【问题描述】:

我有一个基于 hugo-future-imperfect 主题的博客网站,其中在 rmd 中正确创建了 DT 输出,但在应用 serve_site/build_site 时未显示数据(尽管标题是)

我创建了两个全新的网站(因此没有其他复杂性)来说明这个问题。这是代码和输出

```{r DT}
library(DT)
library(tidyverse)

iris %>% 
  datatable()
```

a) 默认主题

b) 雨果不完美

【问题讨论】:

  • 我在使用 Hugo Academic 时遇到了同样的问题。仍在寻找解决方案。

标签: r r-markdown hugo


【解决方案1】:

您可以使用包widgetframe

安装包,然后将数据表保存在变量中。

install.packages("widgetframe")

ts <- iris %>% DT::datatable()

所以当你想显示数据表时,就这么做吧:

widgetframe::frameWidget(ts)

这对我有用!

【讨论】:

    【解决方案2】:

    来自https://owi.usgs.gov/blog/leaflet/https://github.com/rstudio/blogdown/issues/20 的答案是在 iframe 中显示输出。所以:

    将输出绑定到代码中的变量,不要显示此块的输出:

    ```{r, message=FALSE, warning=FALSE, include=FALSE}
    library(DT)
    library(tidyverse)
    
    d1 <- iris %>% 
      datatable()
    
    d1
    
    ```
    

    在下一个块中,将小部件保存到单独的文件中(隐藏此文件的代码和输出)。

    ```{r, message=FALSE, warning=FALSE, include=FALSE}
    library(htmlwidgets)
    library(htmltools)
    
    htmlwidgets::saveWidget(d1, file = "d1.html", selfcontained = TRUE)
    
    ```
    

    小部件不保存为 d1.html,而是创建文件夹 d1 并在文件夹中创建文件 index.html。您需要从 iframe 标记(代码块外)引用此索引文件

    <iframe seamless src="../d1/index.html" width="100%" height="500"></iframe>
    

    您应该会在页面中看到此 iframe 的输出。

    这不是一个很好的解决方法。希望问题能很快在 rblogdown 中得到解决。

    【讨论】:

    • 非常感谢。几点。我认为它应该是 src="../d1/index.html" 我还发现将所有代码组合成一个块(没有 d1 行)就足够了。有什么理由分开吗?希望这个问题是可以解决的,或者至少我们得到一个需要破解的主题和小部件列表
    • 错字的好地方。我已经把它编辑掉了。将代码分成不同的块的原因是您可能不希望您的读者看到包含小部件保存的块,因为这不会构成您所展示的示例的一部分。我想情况并非总是如此,只是一种选择。
    • 那么这是一个坏点(呻吟)和一个好点,那么......再次感谢非常有帮助
    • 同样的问题,同样的主题。这似乎适用于帖子本身,但现在网站的首页似乎是自我引用的,而不是有我的网站的表格?你有这个问题吗?
    • @mdgbeck 最后我切换到了 Icarus 主题。希望这适用于所有 htmlwidgets
    【解决方案3】:

    除了 MrHopko 的上述回答之外,您还可以将数据表支持加入您的主题。今天早上我刚刚破解了我的 hugo 主题来支持数据表。

    在我的示例中,您将直接在主题中进行更改,但也可以使用覆盖机制。

    您可以运行一次DT::saveWidget(d1, "temp.html", selfcontained = FALSE) 以生成必要的库。然后将“temp_files/*”复制到“themes/your-theme/static/lib”

    这将复制几个 javascript 库。然后你需要在你的主题中引用它们。然后你需要将库引入你的局部。然后,您需要将“temp.html”中的依赖项复制到它们关联的部分中。

    然后您需要设置它,以便您的帖子加载这些依赖项。就我而言,我需要将&lt;script&gt; 标签放入“themes/my-theme/layouts/partials/scripts.html”,将&lt;link rel="stylesheet" ...&gt; 标签放入“themes/my-theme/layouts/partials/head.html” .

    就我而言,我补充说:

    <link href="{{ "lib/datatables-css-0.0.0/datatables-crosstalk.css" | relURL }}" rel="stylesheet">
    <link href="{{ "lib/dt-core-1.10.16/css/jquery.dataTables.min.css" | relURL }}" rel="stylesheet">
    <link href="{{ "lib/dt-core-1.10.16/css/jquery.dataTables.extra.css" | relURL }}" rel="stylesheet">
    <link href="{{ "lib/crosstalk-1.0.0/css/crosstalk.css" | relURL }}" rel="stylesheet">
    

    到head.html和

    <script src="{{ "lib/htmlwidgets-1.0/htmlwidgets.js" | relURL }}"></script>
    <script src="{{ "lib/jquery-1.12.4/jquery.min.js" | relURL }}"></script>
    <script src="{{ "lib/datatables-binding-0.4/datatables.js" | relURL }}"></script>
    <script src="{{ "lib/dt-core-1.10.16/js/jquery.dataTables.min.js" | relURL }}"></script> 
    <script src="{{ "lib/crosstalk-1.0.0/js/crosstalk.min.js" | relURL }}"></script> 
    

    到scripts.html

    之后

    ```{r, results = "asis"}
    DT::datatable(d1)
    ```
    

    应该可以。

    【讨论】:

    • +1 你是个天才!!其他人的注意事项:对我来说,我必须做"/lib/...而不是"lib/...。另外,我必须将 htmlwidgets-1.0 更新为 htmlwidgets-1.2。最后,我没有scripts.html,而是js.html 文件。所有这些都取决于主题,因此在这里直接复制粘贴是行不通的。另外,我让它在本地工作,但没有在 netlify 上工作,我意识到我的 .gitignore 文件中有lib/,所以我必须git add ... -f。它有效!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多