【问题标题】:R package not working properly when using PHP exec() function使用 PHP exec() 函数时 R 包无法正常工作
【发布时间】:2012-08-05 01:03:10
【问题描述】:

更新:已解决 我发现了这个问题。

使用 .libPaths() 函数,我能够确定在通过 PHP 运行 Rscript 时,安装 HH 包的默认目录包含在库路径中,即使它是当 R 通过命令提示符执行相同的代码时出现。

我已经通过单独调用 .libPaths('new/file/path'); 解决了这个问题。在我动态创建的语法中。当我这样做时,测试

感谢所有帮助过的人。

我正在创建一个 PHP 脚本,它将在 R 中运行一些分析。此分析需要 hov.bf() 函数,它是 HH 包的一部分,但所有 R 输出(和大概与 R) 相关的进程从调用 hov.bf() 函数的行停止。如果我尝试通过 library('HH'); 加载 HH 库,则会出现相同的症状。让我感到困惑的是,通过(Ubuntu)命令提示符运行时,完全相同的 R 语法代码执行并输出所有打印语句(基本和 HH 函数)而没有错误。

代码概览:

PHP 创建 R 语法并写入文件 Rsyntax.txt。以下一些行位于 R 语法文件中:

dir = '/var/www/someDirectory/';
setwd(dir);
sink('record.lis', append=FALSE, split=TRUE);

print('hello-1');
test <- hov.bf(Values,Grouping);
print('hello-2');

q();

生成语法文件后,PHP接着运行:

exec("/usr/bin/Rscript /var/www/someDirectory/Rsyntax.txt --no-save", $output);

当通过 PHP 运行时,输出文件将包含所有在调用 hov.bf() 之后创建的输出,但在此调用之后似乎什么都没有运行。也就是说,“hello-1”存在于输出文件中,但“hello-2”和 hov.bf() 调用下的所有其他输出不会写入文件。但是,当我将 PHP 的 exec() 中的确切命令复制并粘贴到 Ubuntu 的命令提示符时,它运行 all R 语法没有问题。我还尝试将 .Rprofile 设置为在加载 R 时默认加载 HH 包,但这并没有通过 PHP 解决问题。

如果有人有任何想法,我将不胜感激。我已经没有什么想法了。

谢谢。

【问题讨论】:

  • 我会添加一个sink() 行来关闭文件。
  • 尝试将 sink() 添加到 Rsyntax.txt 的末尾。输出没有变化。 R 似乎仍然停留在 hov.bf 函数上。
  • 另一个问题是在启动时通常不会有 HH::hov.bf、Values 或 Grouping 的值。我没有看到您使用过 require() 或 .我会想象在代码中那个时候会抛出一个错误。您已拆分输出。错误日志说明了什么?
  • 抱歉,这些是在前面的语法文件中定义的。我可以确认这些都填充了正确的值。如果您愿意,我可以添加特定代码,但是会有许多语句来获取此函数中使用的实际值……愚蠢的问题;拆分输出(除了record.lis)存储在哪里?执行此操作时未打开任何提示。
  • 我不知道 stderr() 会返回什么(通常在控制台会话中设置为“终端”),但为什么不使用print(stderr()) 调用而不是第一个打印调用呢?

标签: php r exec rscript


【解决方案1】:

我发现了这个问题。

使用.libPaths() 函数,我能够确定在通过 PHP 运行 Rscript 时,安装 HH 包的默认目录包含在库路径中,即使它出现了当 R 通过命令提示符执行相同的代码时。

我已通过在动态创建的语法中包含对 .libPaths('new/file/path'); 的单独调用来解决此问题。当我这样做时,

test <-require('HH'); 
test; 
returns TRUE;

感谢所有帮助过的人。

【讨论】:

  • 考虑通过单击旁边的“勾选”或“检查”图标将此答案标记为“已接受”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2019-03-28
相关资源
最近更新 更多