Сбой системного вызова Windows при сборке книги «Пакеты R» - PullRequest
0 голосов
/ 11 апреля 2019

Я пытаюсь собрать книгу Хэдли " R Packages " из source . Я скачал и распаковал исходный код и соединил код из Начало работы (с некоторыми изменениями) и код из r-pkgs-first-edition-freeze\book\build-book.r для создания книги (оригинальный код на этом посте). Первая часть кода из Начало работы работает как положено:

# 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() не дает подробного вывода, описанного в Начало работы , но также не выдает ошибку, и .Last.value == TRUE, как и ожидалось, поэтому я думаю, Я в порядке:

devtools::install_github("r-lib/devtools")
has_devel()
.Last.value
  [1] TRUE

Последняя часть кода из Начало работы также работает. Многие из моих пакетов являются более новыми версиями по сравнению с тем, что перечислено в Начало работы , но я не думаю, что это является источником моих последующих проблем.

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. Если это глупая идея, пожалуйста, дайте мне знать.

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Проблема связана с неправильным домашним каталогом R. C:/PROGRA~1 - это просто краткая форма элементов пути , которая действительно указывает на 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" не найден </p>

Вместо этого вы можете установить 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-установка.

Установка переменной среды R в Windows

Допустим, вы нашли здесь свою установку 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)

Обратитесь также к этому ответу и к этому , чтобы получить советы по настройке пути вашего дома R.

0 голосов
/ 13 апреля 2019

Оказывается, возникли две проблемы, каждая из которых вызвала практически одинаковую ошибку при вызове 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 ") не работает, но это тема для другого вопроса.

...