从PHP调用R脚本时,“没有名为'rmarkdown的软件包”

时间:2018-08-28 20:38:49

标签: php python r r-markdown

我有一个运行HTML主页的WAMP服务器3.1.3,该主页接受“开始”日期,“结束”日期和“组织”文本输入。然后,提交按钮会将信息传递给以下php脚本:

<?php
  $from = strtotime($_POST["fromdate"]);
  $to = strtotime($_POST["todate"]);
  $org = $_POST["org"];
  $python = "C:\Python27\python.exe ";
  $pyscript = "C:\wamp64\www\DMARC\Sample_Reports\GetOutlookAttachments.py $from $to $org";
  echo $python, $pyscript;
  chdir("C:\wamp64\www\DMARC\Sample_Reports");
  exec("$python $pyscript");
?>

该脚本获取数据,将其转换为正确的格式,然后将其传递给python 2.7脚本。 python脚本接收的数据用于过滤某些日志。日志过滤后,Python脚本会调用R-markdown脚本来生成HTML报告。调用rmarkdown脚本的Python代码:

    cmd = '"C:/PROGRA~1/R/R-3.5.1/bin/x64/Rscript.exe -e \"Sys.setenv(RSTUDIO_PANDOC=\'C:/Program Files (x86)/Pandoc\'); rmarkdown::render(\'../Filter\ Tool/report.Rmd\')\""'
    os.system(cmd) 

之前,我曾经从cmd运行python脚本,为其提供所需的参数,并且一切正常。 python所做的过滤是正确的,rmarkdown分析了日志并生成了HTML报告。现在,我尝试通过PHP调用运行它,我不断在apache_error.log中得到以下信息:

Error in loadNamespace(name): there is no package called 'rmarkdown'

在rmarkdown脚本顶部,我已确保R使用正确的库路径。我通过将其值粘贴到cmd中并运行来确保exec()的工作正常。我还能尝试什么吗?

编辑:

以下是Markdown脚本的顶部请求:

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
```{r include=FALSE}
library(XML)
library(methods)
library(readbulk)
library(zoo)
library(tidyr)
library(stringr)
library(data.table)
library(ggplot2)
library(plyr)
library(plotly)
library(IPtoCountry)
library(rworldmap)
library(knitr)
library(rmarkdown)
.libPaths(c("C:/Users/username/Documents/R/win-library/3.5", "C:/Program Files/R/R-3.5.1/library"))
```

2 个答案:

答案 0 :(得分:1)

由于rmarkdown不在每个R会话加载的默认软件包中,例如utilsbasestats,因此您需要致电library(rmarkdown)在您的R脚本 outside 中运行的Python命令调用中的第一行。

还考虑使用Python的subprocss.Popen(一种更好的命令行调用处理程序),甚至通过更好的引号处理捕获控制台和错误输出(甚至将Rscript添加到PATH environment variable并避免指定可执行文件的完整目录)。

from subprocess import Popen, PIPE

# COMMAND WITH THREE ARGUMENTS
cmd = ["C:/PROGRA~1/R/R-3.5.1/bin/x64/Rscript.exe", "-e", 
       "Sys.setenv(RSTUDIO_PANDOC='C:/Program Files (x86)/Pandoc'); library(rmarkdown); rmarkdown::render('../Filter Tool/report.Rmd')"

p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE)            
output, error = p.communicate()

if p.returncode == 0:            
    print('R OUTPUT:\n {0}'.format(output))            
else:                
    print('R ERROR:\n {0}'.format(error)) 

答案 1 :(得分:0)

我觉得自己是个白痴。解决方案是在加载所有库之前将.libPaths(c("C:/Users/username/Documents/R/win-library/3.5", "C:/Program Files/R/R-3.5.1/library"))放在markdown脚本的顶部,以指示从何处加载它们。我将其放在底部。