在 BATCH 模式下将工作目录设置为映射的网络驱动器

4

我在Windows上遇到了问题,当我在批处理模式下将工作目录更改为映射到Z:的网络驱动器(例如\ Share \ Folder)时,R会出现故障。如果我在交互式控制台中运行相同的脚本,就不会有任何问题。我通过在Windows批处理(.bat)文件中指定脚本来运行R.exe来完成此操作。.bat文件包含以下内容。

"C:\RRO\R-3.2.1\bin\R.exe" CMD BATCH "C:/Scripts/Rscript.R"

The error is simply...

> setwd( 'Z:/' ) 
 Error in setwd("Z:/") : cannot change working directory

如果这有助于避免问题,我完全可以采用不同的方法来通过Windows任务计划程序调度这些脚本。映射驱动器的原因是我需要提供一些凭据才能访问它,当映射时会自动完成,但如果有人知道如何在R中测试是否不需要这样做,那就可以进行测试。


无法在win7+域上重现。可能取决于您使用的用户凭据...服务器上使用的是什么系统? - HubertL
@HubertL 我正在通过VPN连接到由Windows服务器托管的受限组文件夹 - megawac
您可以使用驱动器的完整路径。打开命令提示符,输入“net use”以查看映射驱动器的完整路径。然后使用远程驱动器的“//volume/path/”作为工作目录。 - TJ Mahr
4个回答

2
我希望这能帮助你解决问题。 我使用Rscript命令而不是CMD BATCH复制了这个没有错误的问题。 以下是我的R代码,我将其保存为脚本(test1.R)。
library(openxlsx)

setwd("P:/Records/Indexing Operations/Indexing Data Analysis/Daily Reports")
my.data = read.xlsx("FSI Daily Project Status Report - 18 Mar 2016.xlsx", sheet = 1) 
setwd("C:/Users/golieth/Documents/")

png(filename = "test.png", width = 500, height = 350 )
plot(my.data$Total.Images, my.data$Completed.Images.A,
 main = Sys.time())
dev.off()

请注意,此文件夹在本文件中被更改了两次。一次是为了访问映射的网络驱动器上的数据,第二次是为了将图像保存到计算机上。我将当前时间戳作为主要的绘图标题,这样您可以重复运行批处理文件并验证其工作情况。

我的批处理文件

cd C:\Program Files\R\R-3.2.3\bin\i386
Rscript C:\Users\golieth\Documents\test1.R

注意:如果您的代码依赖于32位,则需要将批处理文件中的R程序目录(cd)更改为R 32位程序。同样适用于R64。接下来,R脚本应该引用您保存的.R文件的位置。最后,这可能是显而易见的,但在运行批处理文件之前,请确保已连接到VPN。

1

想象一个带有批处理文件的情景:

cd Z:\<Destination>
Z:
RScript "C:/Scripts/Rscript.R"

这将使Windows能够切换到具有所有凭据的目录,然后在该目录中启动R。因此,工作目录是启动R的位置。为此,需要将“C:\ RRO \ R-3.2.1 \ bin \”作为您的PATH变量的一部分。
祝好运!

我会尝试一下。 - megawac
这个可以,如果没有更好的答案(即让我能够切换到直接在外壳之外的位置),我会授予奖励。 - megawac
我对此有一个想法,但我不知道是否可行。尝试在R脚本中使用system("echo "Z:\testfile.txt")命令打开或“回显”文件。这应该连接到网络驱动器。然后使用setwd切换到那里。如果是Windows的.bat文件,则首先利用批处理机制。 - Seily

0
在编写 .bat 文件时,请记住不要使用 cd 命令来更改驱动器号。要更改驱动器号,只需输入驱动器号的名称即可,在最后一次使用 cd 命令进入工作目录之前完成此操作。
例如:

sample.bat

z:
cd z:\your\working\directory\
C:\RRO\R-3.2.1\bin\Rscript.exe C:/Scripts/Rscript.R

-1

您可以在代码中将文件保存在本地,并使用file.copy将文件复制到网络驱动器上。还可以尝试通过完整的网络地址名称替换file.copy中的网络驱动器字母路径,例如\\....\.....\


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接