Windows 构建书籍时系统调用失败 "R Packages"
Windows system call fails while building the book "R Packages"
我正在尝试制作 Hadley 的书“R Packages" from source. I have downloaded and unzipped the source and am have combined the code from Getting started (with some modifications) and the code in r-pkgs-first-edition-freeze\book\build-book.r
to build the book (original code at the of this post). The first part of the code from Getting started 按预期工作:
# install.packages(c("devtools", "roxygen2", "testthat", "knitr")) # orginal code
library(devtools); library(roxygen2); library(testthat); library(knitr) # what I'm using
# install.packages("rstudioapi") # orginal code
library(rstudioapi) # what I'm using
rstudioapi::isAvailable("0.99.149")
[1] TRUE # expected result
在接下来的部分中,has_devel()
没有给出 Getting started 中描述的详细输出,但它也没有抛出错误,并且 .Last.value == TRUE
正如预期的那样,所以我觉得我还好:
devtools::install_github("r-lib/devtools")
has_devel()
.Last.value
[1] TRUE
Getting started 中代码的最后一部分也可以。与 Getting started 中列出的相比,我的许多软件包都是新版本,但我认为这不是我后续问题的根源。
library(roxygen2)
library(testthat)
devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────
setting value
version R version 3.5.1 (2018-07-02)
os Windows 7 x64 SP 1
system x86_64, mingw32
ui RStudio
language (EN)
collate English_United States.1252
tz America/Chicago
date 2019-04-10
─ Packages ───────────────────────────────────────────────────────────────
package * version date source
assertthat 0.2.0 2017-04-11 CRAN (R 3.5.1)
backports 1.1.2 2017-12-13 CRAN (R 3.5.0)
callr 2.0.4 2018-05-15 CRAN (R 3.5.1)
cli 1.0.0 2017-11-05 CRAN (R 3.5.1)
clisymbols 1.2.0 2017-05-21 CRAN (R 3.5.1)
commonmark 1.5 2018-04-28 CRAN (R 3.5.1)
crayon 1.3.4 2017-09-16 CRAN (R 3.5.1)
desc 1.2.0 2018-05-01 CRAN (R 3.5.1)
devtools * 2.0.2.9000 2019-04-11 Github (r-lib/devtools@ab6c878)
digest 0.6.15 2018-01-28 CRAN (R 3.5.1)
evaluate 0.11 2018-07-17 CRAN (R 3.5.1)
fs 1.2.5 2018-07-30 CRAN (R 3.5.1)
glue 1.3.0 2018-07-17 CRAN (R 3.5.1)
htmltools 0.3.6 2017-04-28 CRAN (R 3.5.1)
knitr * 1.20 2018-02-20 CRAN (R 3.5.1)
magrittr 1.5 2014-11-22 CRAN (R 3.5.1)
memoise 1.1.0 2017-04-21 CRAN (R 3.5.1)
oldbookdown * 0.1 2019-04-11 Github (hadley/oldbookdown@0ffc6fb)
pkgbuild 1.0.3 2019-04-11 Github (r-lib/pkgbuild@79cb7a0)
pkgload 1.0.1.9000 2019-04-11 Github (r-lib/pkgload@0ef4f58)
prettyunits 1.0.2 2015-07-13 CRAN (R 3.5.1)
processx 3.1.0 2018-05-15 CRAN (R 3.5.1)
R6 2.2.2 2017-06-17 CRAN (R 3.5.0)
Rcpp 0.12.18 2018-07-23 CRAN (R 3.5.1)
remotes 2.0.3 2019-04-09 url
RevoUtils * 11.0.1 2018-08-01 local
RevoUtilsMath * 11.0.0 2018-08-01 local
rlang 0.2.1 2018-05-30 CRAN (R 3.5.1)
rmarkdown * 1.10 2018-06-11 CRAN (R 3.5.1)
roxygen2 * 6.1.0 2018-07-27 CRAN (R 3.5.1)
rprojroot 1.3-2 2018-01-03 CRAN (R 3.5.1)
rstudioapi * 0.7 2017-09-07 CRAN (R 3.5.1)
sessioninfo 1.0.0 2017-06-21 CRAN (R 3.5.1)
stringi 1.2.4 2018-07-20 CRAN (R 3.5.1)
stringr 1.3.1 2018-05-10 CRAN (R 3.5.1)
testthat * 2.0.0 2017-12-13 CRAN (R 3.5.1)
usethis * 1.4.0 2018-08-14 url
withr 2.1.2 2018-03-15 CRAN (R 3.5.1)
xml2 1.2.0 2018-01-24 CRAN (R 3.5.1)
yaml 2.2.0 2018-07-25 CRAN (R 3.5.1)
build-book.r
中代码的第一部分对我有用:
install_github("hadley/oldbookdown@0ffc6fb") # code I needed to add
library(oldbookdown)
library(rmarkdown)
# Render chapters into tex ------------------------------------------------
needs_update <- function(src, dest) {
if (!file.exists(dest)) return(TRUE)
mtime <- file.info(src, dest)$mtime
mtime[2] < mtime[1]
}
render_chapter <- function(src) {
dest <- file.path("book/tex/", gsub("\.rmd", "\.tex", src))
if (!needs_update(src, dest)) return()
message("Rendering ", src)
command <- bquote(rmarkdown::render(.(src), oldbookdown::tex_chapter(),
output_dir = "book/tex", quiet = TRUE, env = globalenv()))
writeLines(deparse(command), "run.r")
on.exit(unlink("run.r"))
source_clean("run.r")
}
source_clean <- function(path) {
r_path <- file.path(R.home("bin"), "R")
cmd <- paste0(shQuote(r_path), " --quiet --file=", shQuote(path))
out <- system(cmd, intern = TRUE)
status <- attr(out, "status")
if (is.null(status)) status <- 0
if (!identical(as.character(status), "0")) {
stop("Command failed (", status, ")", call. = FALSE)
}
}
chapters <- dir(".", pattern = "\.rmd$")
但是当我尝试实际呈现章节时代码失败:
lapply(chapters, render_chapter)
Rendering check.rmd
Error: Command failed (1)
In addition: Warning message:
In system(cmd, intern = TRUE) :
running command '"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R" --quiet --file="run.r"' had status 1
Called from: source_clean("run.r")
Browse[1]
系统调用失败,但由于我不知道 Windows 调用 "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R" --quiet --file="run.r"
应该做什么,所以我不知道如何解决这个问题。我尝试将 r_path <- file.path(R.home("bin"), "R")
更改为 r_path <- file.path(R.home("bin"))
(因为 C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64
中没有 "R" 目录),但仍然出现以下错误:
lapply(chapters, render_chapter)
Rendering check.rmd
Error in system(cmd, intern = TRUE) :
'"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64"' not found
我也尝试将 file.path(R.home("bin"), "R")
更改为 file.path(R.home("bin"), "R")
,因为此目录中有一个 "R.exe" 可执行文件,同样没有成功。任何指导将不胜感激。
补充信息,回复@onlyphantom:看来,R.home("bin")
发现的断路也影响了其他系统变量,包括R_DOC_DIR
和 R_HOME
。但是 PATH
指向正确的位置,C:\Program Files\Microsoft\R Open\R-3.5.1\bin\x64
.
file.path(R.home("bin"))
[1] "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64"
Sys.getenv() # returned values below are redacted
APPDATA C:\Users\JT\AppData\Roaming
HOME C:/Users/JT/R/Projects
HOMEDRIVE C:
HOMEPATH \Users\JT\R
LOCALAPPDATA C:\Users\JT\AppData\Local
PATH C:\Program Files\Microsoft\R Open\R-3.5.1\bin\x64;...
ProgramData C:\ProgramData
ProgramFiles C:\Program Files
ProgramFiles(x86) C:\Program Files (x86)
R_DOC_DIR C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/doc
R_HOME C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1
R_LIBS_USER C:/Program Files/Microsoft/R Open/R-3.5.1/library
R_USER C:/Users/JT/R
我尝试卸载然后重新安装 R Open,但仍然得到这个:
file.path(R.home("bin"), "R")
[1] "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R"
我尝试切换到常规 R(而不是 R Open),但仍然遇到同样的问题。
Windows 命令行问题: 我一步一步的通过R代码找到了问题的确切位置。它发生在 render_chapter()
调用 source_clean("run.r")
时,最终调用 out <- system(cmd, intern = TRUE)
。 cmd
(对于 chapters
中的第一个对象)是 "C:\Program Files\R\R-3.5.3\bin\x64\R" --quiet --file="run.r"
。当我打开 Windows 命令提示符和 运行 这段代码时,我得到以下信息:
C:\>cd C:\Users\JT\R\Books\r-pkgs-first-edition-freeze
C:\Users...freeze>"C:\Program Files\R\R-3.5.3\bin\x64\R" --quiet --file="run.r"
> rmarkdown::render("check.rmd", oldbookdown::tex_chapter(), output_dir = "book/tex",
+ quiet = TRUE, env = globalenv())
--chapters has been removed. Use --top-level-division=chapter instead.
Try pandoc.exe --help for more information.
Error: pandoc document conversion failed with error 2
Execution halted
当我 运行 pandoc.exe --help
我看到一个条目 --top-level-division=section|chapter|part
。 --chapters
的切换发生在 pandocs v1.17.2
之后,所以我卸载了当前版本并安装了 pandocs v1.17.2
。我认为这解决了问题,但产生了新问题。我现在收到此错误(路径名的短格式或长格式):
C:\Users...freeze>"C:/PROGRA~1/R/R-35~1.3/bin/x64/R" --quiet --file="run.r"
#or#
C:\Users...freeze>"C:\Program Files\R\R-3.5.3\bin\x64\R" --quiet --file="run.r"
> rmarkdown::render("check.rmd", oldbookdown::tex_chapter(), output_dir = "book/
tex",
+ quiet = TRUE, env = globalenv())
pandoc.exe: Unknown reader: markdown_style
Error: pandoc document conversion failed with error 7
Execution halted
我的假设是旧版本 pandocs
与新版本 markdown_style
不兼容。因此,我将尝试安装最新版本的 pandocs,然后编辑 run.r
文件以将 --chapters
更改为 --top-level-division=section|chapter|part
。如果这是一个愚蠢的想法,请告诉我。
问题在于错误的 R 主目录。 C:/PROGRA~1
只是 short form of path elements,实际上指向 C:/PROGRAM FILES/...
。
同理R-35~1.1
,指向/R/R-3.5.1
什么的。只是一个"short name"。
The system call fails, but since I don't know what the Windows call
"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R" --quiet
--file="run.r" is supposed to do, I have no idea how to trouble shoot this.
您的脚本包含以下代码:
source_clean <- function(path) {
r_path <- file.path(R.home("bin"), "R")
...
}
此时 r_path
的值为 C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R
,这可能是由于先前(或失败)安装了 R Open。
I tried changing r_path <- file.path(R.home("bin"), "R") to r_path <-
file.path(R.home("bin")) (since there is no "R" directory in
C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64), but I still get the
error below:
"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64"' not found
您可以做的是直接将 r_path
设置为包含您的 R 安装的目录。打开 R(在 Rstudio 或 R 控制台中)并验证:
file.path(R.home("bin"))
[1] "/Library/Frameworks/R.framework/Resources/bin"
Sys.getenv("R_HOME")
"/Library/Frameworks/R.framework/Resources"
R.home
函数returnsR主目录。如果您导航到计算机上的确切位置,您应该会看到 R 安装所在的位置。
在 Windows
上设置 R 环境变量
假设您在此处找到 R 安装 C:\Program Files\R\R-3.3.2\bin\x86
,然后执行以下操作:
- 打开开始菜单,输入 "View advanced system settings" 并点击 "Environment variables"。
- 在 "System variables"、select 路径下并单击编辑
- 点击“新建”,将R的文件夹地址添加到那里(
C:\Program Files\R\R-3.3.2\bin\x86
)
另请参阅 and this 以获取设置 R 主页路径的提示。
事实证明,有两个问题,在调用 lapply(chapters, render_chapter)
时,这两个问题本质上都给出了相同的错误。它与路径的短版本无关(即 C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R
)。
首先,oldbookdown::tex_chapter()
返回了一个与最新版本的 pandocs
不兼容的列表。所以我改变了 render_chapter
函数如下:
render_chapter <- function(src) {
dest <- file.path("book/tex/", gsub("\.rmd", "\.tex", src))
if (!needs_update(src, dest)) return()
message("Rendering ", src)
# "changed oldbookdown::tex_chapter()" to "temp"
command <- bquote(rmarkdown::render(.(src), temp, output_dir = "book/tex", quiet = TRUE, env = globalenv()))
# added definition for temp (with appropriate changes to
# oldbookdown::tex_chapter()) to the writeLines() call
writeLines(
c(
"temp <- oldbookdown::tex_chapter()",
'temp$pandoc$from <- "markdown"',
'temp$pandoc$args[1] <- "--top-level-division=chapter"',
deparse(command)
),
"run.r"
)
on.exit(unlink("run.r"))
source_clean("run.r")
}
其次,pandocs 在后台调用多个 R 包,如果没有安装它们就会失败。所以我不得不在 chapters
中的每个对象上单独调用 render_chapter
来识别和安装丢失的包。
现在 system("xelatex -interaction=batchmode r-packages ")
失败了,但这是另一个问题的主题。
我正在尝试制作 Hadley 的书“R Packages" from source. I have downloaded and unzipped the source and am have combined the code from Getting started (with some modifications) and the code in r-pkgs-first-edition-freeze\book\build-book.r
to build the book (original code at the of this post). The first part of the code from Getting started 按预期工作:
# install.packages(c("devtools", "roxygen2", "testthat", "knitr")) # orginal code
library(devtools); library(roxygen2); library(testthat); library(knitr) # what I'm using
# install.packages("rstudioapi") # orginal code
library(rstudioapi) # what I'm using
rstudioapi::isAvailable("0.99.149")
[1] TRUE # expected result
在接下来的部分中,has_devel()
没有给出 Getting started 中描述的详细输出,但它也没有抛出错误,并且 .Last.value == TRUE
正如预期的那样,所以我觉得我还好:
devtools::install_github("r-lib/devtools")
has_devel()
.Last.value
[1] TRUE
Getting started 中代码的最后一部分也可以。与 Getting started 中列出的相比,我的许多软件包都是新版本,但我认为这不是我后续问题的根源。
library(roxygen2)
library(testthat)
devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────
setting value
version R version 3.5.1 (2018-07-02)
os Windows 7 x64 SP 1
system x86_64, mingw32
ui RStudio
language (EN)
collate English_United States.1252
tz America/Chicago
date 2019-04-10
─ Packages ───────────────────────────────────────────────────────────────
package * version date source
assertthat 0.2.0 2017-04-11 CRAN (R 3.5.1)
backports 1.1.2 2017-12-13 CRAN (R 3.5.0)
callr 2.0.4 2018-05-15 CRAN (R 3.5.1)
cli 1.0.0 2017-11-05 CRAN (R 3.5.1)
clisymbols 1.2.0 2017-05-21 CRAN (R 3.5.1)
commonmark 1.5 2018-04-28 CRAN (R 3.5.1)
crayon 1.3.4 2017-09-16 CRAN (R 3.5.1)
desc 1.2.0 2018-05-01 CRAN (R 3.5.1)
devtools * 2.0.2.9000 2019-04-11 Github (r-lib/devtools@ab6c878)
digest 0.6.15 2018-01-28 CRAN (R 3.5.1)
evaluate 0.11 2018-07-17 CRAN (R 3.5.1)
fs 1.2.5 2018-07-30 CRAN (R 3.5.1)
glue 1.3.0 2018-07-17 CRAN (R 3.5.1)
htmltools 0.3.6 2017-04-28 CRAN (R 3.5.1)
knitr * 1.20 2018-02-20 CRAN (R 3.5.1)
magrittr 1.5 2014-11-22 CRAN (R 3.5.1)
memoise 1.1.0 2017-04-21 CRAN (R 3.5.1)
oldbookdown * 0.1 2019-04-11 Github (hadley/oldbookdown@0ffc6fb)
pkgbuild 1.0.3 2019-04-11 Github (r-lib/pkgbuild@79cb7a0)
pkgload 1.0.1.9000 2019-04-11 Github (r-lib/pkgload@0ef4f58)
prettyunits 1.0.2 2015-07-13 CRAN (R 3.5.1)
processx 3.1.0 2018-05-15 CRAN (R 3.5.1)
R6 2.2.2 2017-06-17 CRAN (R 3.5.0)
Rcpp 0.12.18 2018-07-23 CRAN (R 3.5.1)
remotes 2.0.3 2019-04-09 url
RevoUtils * 11.0.1 2018-08-01 local
RevoUtilsMath * 11.0.0 2018-08-01 local
rlang 0.2.1 2018-05-30 CRAN (R 3.5.1)
rmarkdown * 1.10 2018-06-11 CRAN (R 3.5.1)
roxygen2 * 6.1.0 2018-07-27 CRAN (R 3.5.1)
rprojroot 1.3-2 2018-01-03 CRAN (R 3.5.1)
rstudioapi * 0.7 2017-09-07 CRAN (R 3.5.1)
sessioninfo 1.0.0 2017-06-21 CRAN (R 3.5.1)
stringi 1.2.4 2018-07-20 CRAN (R 3.5.1)
stringr 1.3.1 2018-05-10 CRAN (R 3.5.1)
testthat * 2.0.0 2017-12-13 CRAN (R 3.5.1)
usethis * 1.4.0 2018-08-14 url
withr 2.1.2 2018-03-15 CRAN (R 3.5.1)
xml2 1.2.0 2018-01-24 CRAN (R 3.5.1)
yaml 2.2.0 2018-07-25 CRAN (R 3.5.1)
build-book.r
中代码的第一部分对我有用:
install_github("hadley/oldbookdown@0ffc6fb") # code I needed to add
library(oldbookdown)
library(rmarkdown)
# Render chapters into tex ------------------------------------------------
needs_update <- function(src, dest) {
if (!file.exists(dest)) return(TRUE)
mtime <- file.info(src, dest)$mtime
mtime[2] < mtime[1]
}
render_chapter <- function(src) {
dest <- file.path("book/tex/", gsub("\.rmd", "\.tex", src))
if (!needs_update(src, dest)) return()
message("Rendering ", src)
command <- bquote(rmarkdown::render(.(src), oldbookdown::tex_chapter(),
output_dir = "book/tex", quiet = TRUE, env = globalenv()))
writeLines(deparse(command), "run.r")
on.exit(unlink("run.r"))
source_clean("run.r")
}
source_clean <- function(path) {
r_path <- file.path(R.home("bin"), "R")
cmd <- paste0(shQuote(r_path), " --quiet --file=", shQuote(path))
out <- system(cmd, intern = TRUE)
status <- attr(out, "status")
if (is.null(status)) status <- 0
if (!identical(as.character(status), "0")) {
stop("Command failed (", status, ")", call. = FALSE)
}
}
chapters <- dir(".", pattern = "\.rmd$")
但是当我尝试实际呈现章节时代码失败:
lapply(chapters, render_chapter)
Rendering check.rmd
Error: Command failed (1)
In addition: Warning message:
In system(cmd, intern = TRUE) :
running command '"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R" --quiet --file="run.r"' had status 1
Called from: source_clean("run.r")
Browse[1]
系统调用失败,但由于我不知道 Windows 调用 "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R" --quiet --file="run.r"
应该做什么,所以我不知道如何解决这个问题。我尝试将 r_path <- file.path(R.home("bin"), "R")
更改为 r_path <- file.path(R.home("bin"))
(因为 C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64
中没有 "R" 目录),但仍然出现以下错误:
lapply(chapters, render_chapter)
Rendering check.rmd
Error in system(cmd, intern = TRUE) :
'"C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64"' not found
我也尝试将 file.path(R.home("bin"), "R")
更改为 file.path(R.home("bin"), "R")
,因为此目录中有一个 "R.exe" 可执行文件,同样没有成功。任何指导将不胜感激。
补充信息,回复@onlyphantom:看来,R.home("bin")
发现的断路也影响了其他系统变量,包括R_DOC_DIR
和 R_HOME
。但是 PATH
指向正确的位置,C:\Program Files\Microsoft\R Open\R-3.5.1\bin\x64
.
file.path(R.home("bin"))
[1] "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64"
Sys.getenv() # returned values below are redacted
APPDATA C:\Users\JT\AppData\Roaming
HOME C:/Users/JT/R/Projects
HOMEDRIVE C:
HOMEPATH \Users\JT\R
LOCALAPPDATA C:\Users\JT\AppData\Local
PATH C:\Program Files\Microsoft\R Open\R-3.5.1\bin\x64;...
ProgramData C:\ProgramData
ProgramFiles C:\Program Files
ProgramFiles(x86) C:\Program Files (x86)
R_DOC_DIR C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/doc
R_HOME C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1
R_LIBS_USER C:/Program Files/Microsoft/R Open/R-3.5.1/library
R_USER C:/Users/JT/R
我尝试卸载然后重新安装 R Open,但仍然得到这个:
file.path(R.home("bin"), "R")
[1] "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R"
我尝试切换到常规 R(而不是 R Open),但仍然遇到同样的问题。
Windows 命令行问题: 我一步一步的通过R代码找到了问题的确切位置。它发生在 render_chapter()
调用 source_clean("run.r")
时,最终调用 out <- system(cmd, intern = TRUE)
。 cmd
(对于 chapters
中的第一个对象)是 "C:\Program Files\R\R-3.5.3\bin\x64\R" --quiet --file="run.r"
。当我打开 Windows 命令提示符和 运行 这段代码时,我得到以下信息:
C:\>cd C:\Users\JT\R\Books\r-pkgs-first-edition-freeze
C:\Users...freeze>"C:\Program Files\R\R-3.5.3\bin\x64\R" --quiet --file="run.r"
> rmarkdown::render("check.rmd", oldbookdown::tex_chapter(), output_dir = "book/tex",
+ quiet = TRUE, env = globalenv())
--chapters has been removed. Use --top-level-division=chapter instead.
Try pandoc.exe --help for more information.
Error: pandoc document conversion failed with error 2
Execution halted
当我 运行 pandoc.exe --help
我看到一个条目 --top-level-division=section|chapter|part
。 --chapters
的切换发生在 pandocs v1.17.2
之后,所以我卸载了当前版本并安装了 pandocs v1.17.2
。我认为这解决了问题,但产生了新问题。我现在收到此错误(路径名的短格式或长格式):
C:\Users...freeze>"C:/PROGRA~1/R/R-35~1.3/bin/x64/R" --quiet --file="run.r"
#or#
C:\Users...freeze>"C:\Program Files\R\R-3.5.3\bin\x64\R" --quiet --file="run.r"
> rmarkdown::render("check.rmd", oldbookdown::tex_chapter(), output_dir = "book/
tex",
+ quiet = TRUE, env = globalenv())
pandoc.exe: Unknown reader: markdown_style
Error: pandoc document conversion failed with error 7
Execution halted
我的假设是旧版本 pandocs
与新版本 markdown_style
不兼容。因此,我将尝试安装最新版本的 pandocs,然后编辑 run.r
文件以将 --chapters
更改为 --top-level-division=section|chapter|part
。如果这是一个愚蠢的想法,请告诉我。
问题在于错误的 R 主目录。 C:/PROGRA~1
只是 short form of path elements,实际上指向 C:/PROGRAM FILES/...
。
同理R-35~1.1
,指向/R/R-3.5.1
什么的。只是一个"short name"。
The system call fails, but since I don't know what the Windows call "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R" --quiet --file="run.r" is supposed to do, I have no idea how to trouble shoot this.
您的脚本包含以下代码:
source_clean <- function(path) {
r_path <- file.path(R.home("bin"), "R")
...
}
此时 r_path
的值为 C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R
,这可能是由于先前(或失败)安装了 R Open。
I tried changing r_path <- file.path(R.home("bin"), "R") to r_path <- file.path(R.home("bin")) (since there is no "R" directory in C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64), but I still get the error below: "C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64"' not found
您可以做的是直接将 r_path
设置为包含您的 R 安装的目录。打开 R(在 Rstudio 或 R 控制台中)并验证:
file.path(R.home("bin"))
[1] "/Library/Frameworks/R.framework/Resources/bin"
Sys.getenv("R_HOME")
"/Library/Frameworks/R.framework/Resources"
R.home
函数returnsR主目录。如果您导航到计算机上的确切位置,您应该会看到 R 安装所在的位置。
在 Windows
上设置 R 环境变量假设您在此处找到 R 安装 C:\Program Files\R\R-3.3.2\bin\x86
,然后执行以下操作:
- 打开开始菜单,输入 "View advanced system settings" 并点击 "Environment variables"。
- 在 "System variables"、select 路径下并单击编辑
- 点击“新建”,将R的文件夹地址添加到那里(
C:\Program Files\R\R-3.3.2\bin\x86
)
另请参阅
事实证明,有两个问题,在调用 lapply(chapters, render_chapter)
时,这两个问题本质上都给出了相同的错误。它与路径的短版本无关(即 C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R
)。
首先,oldbookdown::tex_chapter()
返回了一个与最新版本的 pandocs
不兼容的列表。所以我改变了 render_chapter
函数如下:
render_chapter <- function(src) {
dest <- file.path("book/tex/", gsub("\.rmd", "\.tex", src))
if (!needs_update(src, dest)) return()
message("Rendering ", src)
# "changed oldbookdown::tex_chapter()" to "temp"
command <- bquote(rmarkdown::render(.(src), temp, output_dir = "book/tex", quiet = TRUE, env = globalenv()))
# added definition for temp (with appropriate changes to
# oldbookdown::tex_chapter()) to the writeLines() call
writeLines(
c(
"temp <- oldbookdown::tex_chapter()",
'temp$pandoc$from <- "markdown"',
'temp$pandoc$args[1] <- "--top-level-division=chapter"',
deparse(command)
),
"run.r"
)
on.exit(unlink("run.r"))
source_clean("run.r")
}
其次,pandocs 在后台调用多个 R 包,如果没有安装它们就会失败。所以我不得不在 chapters
中的每个对象上单独调用 render_chapter
来识别和安装丢失的包。
现在 system("xelatex -interaction=batchmode r-packages ")
失败了,但这是另一个问题的主题。