脚本从 R 运行,但不是通过命令行

Posted

技术标签:

【中文标题】脚本从 R 运行,但不是通过命令行【英文标题】:Script runs from R, but not via command line 【发布时间】:2013-11-21 17:04:31 【问题描述】:

我有一个可以在 R 和 R Studio 中完美运行的 R 脚本。它包括使用 RODBC 包,我在其中连接到 Oracle 数据库以获取一些数据。

我在 R Studio 中编写了整个内容,它可以完美运行。我也可以通过键入以下内容直接从 R 控制台毫无问题地运行它:

source("C:/Users/yadda.yadda/script.R")

这意味着它能够获取我的所有连接信息并通过 RODBC 连接到 Oracle,而无需我提供任何信息。

我想做的下一步是将其设置为定期运行作为计划任务。为此,我编写了一个包含以下内容的小 bat 文件:

C:\R\R-2.15.2\bin\Rscript.exe "C:\Users\yadda.yadda\script.R"
PAUSE

当我运行 bat 文件时,它会从我的脚本中打印出初始的“打印”语句,但由于“第一个参数不是打开的 RODBC 通道”而失败。完整输出如下:

C:\Users\yadda.yadda\schedule>C:\R\R-2.15.2\bin\Rscript.exe "C:\Users\yadda.yadda\script.R"
[1]
Housekeeping
Loading required files
Loading the function
Calling the function...
Loading required package: RODBC
Error in sqlQuery(channelMflib, the.SQL) :
first argument is not an open RODBC channel
Calls: get.all.areas -> oceans.get.data -> sqlQuery
Execution halted

C:\Users\yadda.yadda\schedule>PAUSE
Press any key to continue . . .

我一直在用谷歌搜索,但无法弄清楚。我能够运行一个不包含 RODBC 连接的更简单的 R 脚本,所以我知道 bat 文件语法很好。

如果我不能解决它,我会考虑使用 ROracle(而不是 RODBC)尝试它,但由于这里没有其他人使用 ROracle,它几乎不会像我的同事那样灵活/可交换。

感谢您的任何见解! 迈克

编辑

nograpes 要求提供 script.R 的准系统版本。我已经创建了一个,但在这样做时,可能会得到一条信息略多的错误消息。

script.R 是:

print("starting")
require(RODBC)
print("loaded RODBC")
channel<-odbcConnect(thedsn,username,password) 
the.SQL <-paste("SELECT * from dual;",sep="")
df<-sqlQuery(channel,the.SQL)
print("done, data to follow")
print(df)

使用上面的输出是:

[1] "starting"
Loading required package: RODBC
Warning message:
package 'RODBC' was built under R version 2.15.3
[1] "loaded RODBC"
Warning messages:
1: In odbcDriverConnect("DSN=thedsn;UID=username;PWD=password") :
[RODBC] ERROR: state IM014, code 0, message [Microsoft][ODBC Driver Manager] The specified DSN contains an architecture mismatch between the Driver and Application
2: In odbcDriverConnect("DSN=thedsn;UID=username;PWD=password") :
ODBC connection failed
Error in sqlQuery(channel, the.SQL) :
first argument is not an open RODBC channel
Execution halted

显然,我已经更改了用户名和密码,但我知道我使用的那些可以正常工作,并且能够让脚本打印出它正在使用的内容并确认它们没有问题。

我以前没有见过“架构不匹配”,所以我也会用谷歌搜索。 为了记录,我一直在使用 64 位 R - 我想知道我是否可以强制它使用 32 位,看看是否有区别 我想我一直在使用 32 位 R,所以我会看看我是否可以强制它使用 64 位 - 我似乎记得读过不匹配错误与 RODBC 的 32/64 位使用有关。我也会用谷歌搜索。感谢阅读。

【问题讨论】:

你能发帖script.R吗?试着把它剪到只剩下基本部分(所以它仍然失败,但只有很少的行)。 完成。感谢收看。 【参考方案1】:

好的-我知道了- 我修改了我的批处理文件以强制它使用 64 位 R,并且它起作用了。

代替

C:\R\R-2.15.2\bin\Rscript.exe

我用过:

C:\R\R-2.15.2\bin\x64\Rscript.exe

它有效。

感谢您的提示,它给了我更多信息的错误消息。

【讨论】:

这个解决方案对我有用。我遇到了完全相同的问题,问题是 bat 文件头部的 64 位 R。【参考方案2】:

很高兴你让它工作了。对于因为遇到类似问题而阅读此消息的人,需要记住的一件事是在测试运行之前使用 rm() 命令清除变量,

rm(list=ls())
source("script.R")

【讨论】:

以上是关于脚本从 R 运行,但不是通过命令行的主要内容,如果未能解决你的问题,请参考以下文章

如果从命令行运行 Julia 脚本,是不是每次都需要重新编译?

从脚本在命令行上运行 MySQL 查询 [重复]

该脚本从命令行运行,但 crontab 失败

在 argparse 中从变量而不是命令行获取值

如何通过命令行运行 php 脚本(并在注销后保持运行)

为啥这个带有 shell_exec 调用的 PHP 脚本从 Windows 10 的命令行运行,而不是浏览器/本地主机?