R CMD build.терпит неудачу: "аргумент имеет нулевую длину" - PullRequest
0 голосов
/ 02 декабря 2018

R CMD build . в моем пакете произошел сбой со следующим бесполезным выводом:

* checking for file ‘./DESCRIPTION’ ... OK
* preparing ‘myPackage’:
* checking DESCRIPTION meta-information ... OK
* cleaning src
* checking for LF line-endings in source and make files and shell scripts
* checking for empty or unneeded directories
Error in if (dep$op != ">=") next : argument is of length zero
Execution halted

RStudio также дает бесполезный вывод:

ОШИБКА: Каталог сборки не содержит ОПИСАНИЕфайл не может быть собран как пакет.

Каталог сборки: ~ / myPackage

(файл DESCRIPTION явно существует)

Вот мой DESCRIPTION file:

Package: myPackage
Version: 0.1.0
Title: This is my package
Author: Michael Chirico
Maintainer: Michael Chirico <my_email@gmail.com>
Depends: R
Description: My package is great!
Imports: Rcpp (>= 1.0.0)
LinkingTo: Rcpp

Что не так с моей структурой пакета?

1 Ответ

0 голосов
/ 02 декабря 2018

Depends: R должен иметь зависимость от версии R:

Depends: R (>= 3.0.0)

(или что угодно)

Это указано в Запись расширений R:

Нет смысла объявлять зависимость от R без спецификации версии или от пакета base: это пакет R и пакет base всегда доступен.

Итак, я мог бы просто удалить эту строку (если у моего пакета нет других зависимостей).

При этом сборка завершается сразу.

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

Ошибка в if (dep$ op! = "> =") далее: аргумент имеет нулевую длину

Конечно, выглядит знакомым как код R - ясно, что dep$op (что бы это ни было) отсутствует / не объявлено по какой-то причине,Неясно, какой код выполняется / какая функция вызывает эту ошибку.

Но какой бы код он ни находился внутри источника R , так что мы можем:

  1. Испытать удачу с поиском сообщения в GitHub в репозитории(может быть сложно сопоставить из-за различных разделителей / других символов, обычно пропускаемых из веб-поиска)
  2. Клонировать репозиторий и использовать grep (и т. д.) в исходном коде (более гибкий, но требует загрузкиполный R источник, если у вас его еще нет)

Сегодня мне посчастливилось получить удар по GitHub для "if (dep$op != ">=") next" в двух файлах;src/library/tools/R/build.R выглядит так, как будто это на носу.

Вот область, где находится этот фрагмент:

ixup_R_dep <- function(pkgname, ver = "2.10")
    {
        desc <- .read_description(file.path(pkgname, "DESCRIPTION"))
        Rdeps <- .split_description(desc)$Rdepends2
        for(dep in Rdeps) {
            if(dep$op != '>=') next
            if(dep$version >= package_version(ver)) return()
        }

Это в пакете tools, поэтому вспомогательные функции доступны какнапример, tools:::.read_description.

При этом было легко увидеть, что Rdeps захватывает секцию Depends: R DESCRIPTION и что он также ожидает найти тег версии;dep$op - это эратор op, применяемый к признаку dep.

...