R: Почему иногда fs :: dir_copy дает сбой? - PullRequest
0 голосов
/ 05 мая 2020

Во время процесса мне нужно скопировать каталог, используя fs::dir_copy(currentPath, newPath). Иногда я получаю следующее сообщение об ошибке:

Error in link_copy(links, path(new_path[[i]], path_rel(links, path[[i]])), : all(is_link(path)) is not TRUE

Это происходит иногда, а не всегда. Более того, если я заменю свой каталог собственной копией (например, вручную скопирую каталог, удалю оригинал, переименую копию), тогда мой код будет работать.

Не могли бы вы объяснить, почему это могло происходить? Есть ли способ избежать этой ошибки раз и навсегда?

1 Ответ

3 голосов
/ 15 мая 2020

Это не отвечает на ваш вопрос, но может помочь вам в дальнейшем анализе происходящего. Одна из замечательных особенностей R - то, что вы можете легко проверять исходный код. Особенно в ситуации, когда кажется, что происходят необычные вещи, просмотр кода может быть полезным.

В вашем случае мы можем проверить исходный код fs::dir_copy и отследить, какой код генерирует сообщение об ошибке. Если вы наберете fs::dir_copy (без скобок) в консоли, R напечатает R-код функции (если функция не является примитивной). Это покажет вам, что функция fs:dir_copy вызывает функцию fs::link_copy. Имеет смысл, поскольку сообщение об ошибке исходит от этой функции. Теперь мы можем распечатать эту функцию с помощью fs::link_copy. Эта функция генерирует сообщение об ошибке в этой строке:

stopifnot(all(is_link(path)))

Из сообщения об ошибке мы знаем, что all(is_link(path)) возвращает FALSE. Следующий шаг - взглянуть на функцию fs::is_link. Здесь мы видим, что ошибка может быть вызвана вызовом функции setNames, которая зависит от функции fs::file_info: res <- file_info(path) Здесь мы видим, что setNames вызывается с условием, зависящим от того, что вернула функция file_info:

setNames(!is.na(res$type) & res$type == "symlink", res$path)

Это выглядит необычно, поскольку setNames принимает объект и вектор символов как формальные. Но тогда я не являюсь разработчиком этих функций ;-) Возможно, на вашем компьютере есть проблемы с типом файла, и fs::file_info(path) возвращает что-то неожиданное при некоторых условиях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...