[在执行过程中,我需要使用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
这仅在某些时间发生,并非总是如此。而且,如果我用目录本身的手动副本替换目录(即手动复制目录,删除原始目录,重命名副本),那么我的代码将起作用。
有人可以解释为什么会这样吗?有没有办法我可以一劳永逸地避免该错误?
这不能回答您的问题,但可以帮助您进一步分析发生的情况。 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)
[[0]看起来很不寻常,因为setNames
将一个对象和一个字符向量作为形式。但是,我不是这些功能的开发人员;-)也许您的计算机上的文件类型存在问题,并且file_info(path)
在某些情况下会返回意外的内容。