构建书籍“R Packages”时Windows系统调用失败

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

我正在尝试从R Packages建立Hadley的书“source”。我已经下载并解压缩了源码,并且已经将Getting started(带有一些修改)的代码和r-pkgs-first-edition-freeze\book\build-book.r中的代码组合起来构建了本书(本文的原始代码)。来自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_DIRR_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)cmdchapters的第一个对象)是"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 system-calls pandoc
2个回答
2
投票

问题在于错误的R主目录。 C:/PROGRA~1只是short form of path elements,并且真正指向C:/PROGRAM FILES/...

R-35~1.1也一样,它指向/R/R-3.5.1或其他东西。这只是一个“简称”。

系统调用失败,但由于我不知道Windows调用什么“C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64/R”--quiet --file =“run.r”应该这样做,我不知道如何解决这个问题。

您的脚本包含以下代码:

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安装造成的。

我尝试将r_path < - file.path(R.home(“bin”),“R”)更改为r_path < - file.path(R.home(“bin”))(因为没有“R”目录C:/PROGRA~1/MIE74D~1/ROPEN~1/R-35~1.1/bin/x64),但我仍然得到以下错误:“C:/ PROGRA~1 / MIE74D~1 / ROPEN~1 /没找到R-35~1.1 / bin / x64“'

你可以做的是将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函数返回R主目录。如果您导航到计算机上的确切位置,您应该会看到R安装的位置。

在Windows上设置R环境变量

假设你在这里找到你的R安装C:\Program Files\R\R-3.3.2\bin\x86,然后执行以下操作:

  1. 打开“开始”菜单,键入“查看高级系统设置”,然后单击“环境变量”。
  2. 在“系统变量”下,选择“路径”,然后单击“编辑”
  3. 单击“新建”,然后将R的文件夹地址添加到那里(C:\Program Files\R\R-3.3.2\bin\x86

另请参阅this answerthis以获取设置R home路径的提示。


0
投票

事实证明,有两个问题,当调用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包,如果没有安装则失败。所以我不得不分别在render_chapter上的每个对象上调用chapters来识别和安装丢失的包。

现在system("xelatex -interaction=batchmode r-packages ")失败了,但这是一个针对不同问题的主题。

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