如何解决pandoc问题

6
我在使用VSCode中的saveWidget时遇到了问题,可能是由于pandoc引起的。
当我在Rstudio中运行以下代码时,它可以正常工作,并生成mtcars.html
htmlwidgets::saveWidget(DT::datatable(mtcars), "mtcars.html", selfcontained = TRUE, title = "mtcars")

然而,当我将相同的代码移植到VSCode时,它会出现错误提示,指出
Error in htmlwidgets::saveWidget(DT::datatable(mtcars), "mtcars.html",  : 
  Saving a widget with selfcontained = TRUE requires pandoc. For details see:
https://github.com/rstudio/rmarkdown/blob/master/PANDOC.md

我怀疑 VSCode 没有识别出 pandoc 的路径,因为我在 VSCode 中输入 find_pandoc 来查找版本和目录,结果显示

> rmarkdown::find_pandoc()
$version
[1] '0'

$dir
NULL

然而,在Rstudio中它显示

> find_pandoc()
$version
[1] ‘2.7.2’

$dir
[1] "C:/Program Files/RStudio/bin/pandoc"

我不知道从什么时候开始这样做的,但是我在我的~/.Rprofile中有Sys.setenv(RSTUDIO_PANDOC="/R/RStudio/bin/pandoc")(据说是为了不使用R/RStudio之外安装的pandoc)。如果您在VSCode环境中设置了它,那么find_pandoc()是否能够找到它,并且错误是否消失? - r2evans
1
@r2evans 嗯...看起来错误还在。 - ThomasIsCoding
1
@ThomasIsCoding 在 VSCode 中运行 rmarkdown:::find_program("pandoc") 会返回什么?Sys.getenv("RSTUDIO_PANDOC") 呢?Sys.which("pandoc") 呢?以上全部在 VSCode 中。你可能需要将 pandoc 可执行文件的路径("C:/Program Files/RStudio/bin/pandoc")添加到系统范围内的 PATH 变量中。 - slava-kohut
问题在于RSUDIO_PANDOC变量没有在VSCode中设置为pandoc路径。如果将pandoc添加到PATH有所帮助,我会写一份详细的答案。 - slava-kohut
@slava-kohut 哇!太感谢了。将PATH变量添加到系统环境变量中就可以解决问题了!请详细写下您的答案,我会接受它! - ThomasIsCoding
1个回答

5
为了理解发生了什么,让我们来看一下rmarkdown:::find_pandoc()的源代码。在那里我们可以找到以下几行:
sys_pandoc <- find_program("pandoc")
sources <- c(Sys.getenv("RSTUDIO_PANDOC"), if (nzchar(sys_pandoc)) dirname(sys_pandoc))

sources 用于获取 pandoc 路径。我怀疑在你的情况下,RSTUDIO_PANDOC 没有被设置,因此 rmarkdown:::find_pandoc() 依赖于 find_program("pandoc") 来查找路径。如果你进一步查看其源代码,你会发现该路径是通过运行 Sys.which 来确定的,这相当于从 shell 提取路径:

系统命令 which 报告可执行文件(包括可执行脚本)的完整路径名,就像在 shell 中执行一样...

话虽如此,在你的系统中需要将 pandoc 的路径添加到 PATH 环境变量中。


@ThomasIsCoding是我的信息来源,不够可靠吗?我以前从未回答过悬赏问题,也不知道这是怎么运作的。 - slava-kohut
1
系统似乎会在接受答案后的一天内授予悬赏。不用担心,我会在系统允许我的时候进行操作。 - ThomasIsCoding
1
你说我们需要将 pandoc 的路径添加到系统的 PATH 环境变量中,但你没有说明如何做到这一点。你能否编辑你的回答来详细解释一下?我已经找到了 pandoc.exe 的位置,但是我该如何告诉 VSCode 中的 R 它在哪里?在 VSCode 的 JSON 设置中吗? - coip

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接