«при вызове R-скрипта из PHP нет пакета с именем« rmarkdown » - PullRequest
0 голосов
/ 28 августа 2018

У меня есть сервер WAMP 3.1.3, на котором запущена главная страница HTML, которая принимает текстовые данные «начало», «конец» и «организация». Кнопка отправки, после чего информация передается в следующий скрипт 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. Код Python, который вызывает скрипт rmarkdown:

    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) 

Раньше я запускал скрипт python из cmd, предоставляя ему необходимые аргументы, и все работало нормально. Фильтрация, выполненная python, была правильной, rmarkdown анализировал логи и генерировал HTML-отчеты. Теперь, когда я пытаюсь запустить его из вызова PHP, я постоянно получаю следующее в apache_error.log:

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

Я удостоверился, что R использует правильные пути для библиотек, указал путь в верхней части скрипта rmarkdown. Я убедился, что то, что входит в exec (), работает, вставляя его значение в cmd, и оно работает. Что-нибудь еще я могу попробовать?

EDIT:

В соответствии с запросом здесь находится верхняя часть скрипта уценки:

```{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 голосов
/ 29 августа 2018

Я чувствую себя идиотом. Решением было поместить .libPaths(c("C:/Users/username/Documents/R/win-library/3.5", "C:/Program Files/R/R-3.5.1/library")) в верхнюю часть скрипта уценки до того, как все библиотеки будут загружены, чтобы указать, откуда их загружать. Я помещал это внизу.

0 голосов
/ 29 августа 2018

Поскольку rmarkdown не входит в число пакетов по умолчанию, загружаемых с каждым сеансом R, таких как utils, base и stats, вам необходимо вызвать строку library(rmarkdown) в вызове команды Python, который запускает снаружи ваш R скрипт.

Также рассмотрите возможность использования Python subprocss.Popen, лучшего обработчика для вызовов командной строки, чтобы даже захватывать консоль и вывод ошибок с лучшей обработкой кавычек (и даже добавлять Rscript к PATH переменная окружения и избегайте указания полного каталога для исполняемого файла).

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)) 
...