pdf 幻灯片中的 str_view() 不再起作用

问题描述 投票:0回答:1

过去,如果安装了

str_view()
软件包,
webshot
的 html 输出可以正确呈现在 pdf 幻灯片中(另请参阅这个答案)。然而,这不再有效。

以下 Rmd 文件应生成标题幻灯片和显示正则表达式示例的幻灯片:

---
title: "Regex"
output: beamer_presentation
---

```{r setup, include=FALSE}
library(stringr)
```

## `str_view`

```{r regex1}
str_view(c("abc", "bcd", "cde"), "bc", html = TRUE)
```

如果只安装了

webshot
软件包,而不安装
webshot2
,我在编织时会收到以下错误:

Error:
! webshot.js returned failure value: 1
Backtrace:
  1. rmarkdown::render(...)
  2. knitr::knit(knit_input, knit_output, envir = envir, quiet = quiet)
  3. knitr:::process_file(text, output)
  7. knitr:::process_group.block(group)
  8. knitr:::call_block(x)
     ...
 19. knitr (local) value_fun(ev$value, ev$visible)
 20. knitr (local) fun(x, options = options)
 22. knitr::knit_print(x, ...)
 23. knitr:::html_screenshot(x)
 26. webshot (local) `<fn>`(...)
Execution halted

调用

webshot::is_phantomjs_installed()
返回
TRUE
,因此PhantomJS已安装。

如果我安装

webshot2
,编织工作不会出错,但
str_view()
的html输出不会显示:

enter image description here

过去可以创建的预期输出看起来像这样(使用图像处理程序重新创建):

enter image description here

这里有什么问题吗?还有办法让它发挥作用吗?

(我知道我可以使用

str_view()
的文本输出而不使用
html = TRUE
,但我更喜欢 html 输出。)

我使用以下版本在 Ubuntu 22.04.2 上运行此程序:

  • R 4.3.1
  • Pandoc 3.1.1(RStudio自带版本)
  • 网络快照0.5.5
  • webshot2 0.1.0
  • 降价2.23
  • 针织1.43
  • stringr 1.5.0
r r-markdown knitr stringr
1个回答
0
投票

我终于找到了这个问题的原因,它与

webshot2
依赖于基于Chromium的浏览器来截取由
str_view()
创建的html小部件的屏幕截图有关。

渲染 Rmd 文件时,html 小部件将存储在 R 会话使用的临时文件夹中的 html 文件中,该临时文件夹位于

/tmp
内。
webshot2
然后使用基于 chromium 的浏览器(在我的例子中是勇敢的)打开该文件并截取屏幕截图。然而,在 Ubuntu Brave 中,Chromium 和 Chrome 都是以 snap 的形式安装的,并且不允许 snap 访问
/tmp
,因此截图失败。

我找到了两个解决方案:

  • 您可以通过将以下行添加到您家中的文件

    .Renviron
    来更改 R 会话存储临时数据的目录(如果不存在,则创建它)(请参阅此答案):

    TMPDIR = "PATH_TO_YOUR_TEMPDIR"
    

    请注意,路径必须位于您的家中,并且不能是隐藏目录或位于隐藏目录中,以便快照能够访问它。

  • 您还可以仅在使用包unixtools呈现Rmd文件的R会话中更改临时目录(请参阅这个答案)。安装软件包

    remotes::install_github("s-u/unixtools")
    

    然后,将以下内容添加到 Rmd 文件中的块中:

    library(unixtools)
    tmp_dir <- "tmp/"
    dir.create(tmp_dir, showWarnings = FALSE)
    set.tempdir(normalizePath(tmp_dir))
    

    这将在存储 Rmd 文件的同一目录中创建一个子文件夹

    tmp/
    并将其用于临时数据。 (当然,如果您愿意,您可以使用不同的文件夹,同样具有上述限制。)

这使我能够成功构建我的投影仪演示文稿,但不幸的是,结果并不令人满意:小部件的屏幕截图太小了。但这是另一个问题...

© www.soinside.com 2019 - 2024. All rights reserved.