Как передать аргумент из PHP в R-скрипт через exec() и использовать его в R-скрипте?

#php #r #exec

Вопрос:

У меня проблема с PHP и R. Я хочу вызвать и выполнить R — скрипт из PHP-кода. Но я не знаю, как передавать аргументы через exec() из PHP и как использовать эти аргументы в моем R-скрипте.

Это мой PHP-код

 <?php
    exec('C:\"Program Files"\R\R-4.0.3\bin\Rscript.exe C:\xampp\htdocs\chatchops\R_privatChat\R_TodayOnline.R');
?>
 

это часть моего сценария R

 library(dygraphs)
library(DBI)
library(RMySQL)
library(htmlwidgets)

#get db Connection
mydb <- dbConnect(MySQL(), user='root', password='', dbname='chatchops', host='localhost', port=3307)

ye <- '2021'
mon <- '10'

    #get data from MySQL database
    query <- paste0("SELECT d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19, d20, d21, d22, d23, d24, d25, d26, d27, d28, d29, d30, d31 FROM `analizeonlineeachmonthd` WHERE recYear = ",ye," AND recMonth = ",mon,";")
    result1 <- dbSendQuery(mydb, query)
    timeData <- fetch(result1)
    dbClearResult(result1)
    
    dbDisconnect(mydb)
 

Я хочу передать это значение «ye» и «mon» из функции PHP exec и использовать его в своем коде R-скрипта. кто-нибудь может мне помочь в этом? Или кто-нибудь знает другой способ сделать это?

Кроме того, я попробовал эти два способа. Но не на работе.

 <?php
$ye = "2021";  $mon = "10";
  exec('C:\"Program Files"\R\R-4.0.3\bin\Rscript.exe C:\xampp\htdocs\chatchops\R_privatChat\R_TodayOnline.R' ,$ye ,$mon);
?>
 

В сценарии R

 library(dygraphs)
library(DBI)
library(RMySQL)
library(htmlwidgets)

mydb <- dbConnect(MySQL(), user='root', password='', dbname='chatchops', host='localhost', port=3307)
args <- commandArgs(trailingOnly = TRUE)
ye <- args[1]
mon <- args[2]
 

и

 args <- commandArgs(TRUE)
ye <- args[1]
mon <- args[2]
 

Кто-нибудь может мне помочь? или кто-нибудь может дать другой простой способ сделать это. Проблема возникает, когда я пытаюсь передать аргумент или когда я пытаюсь зарезервировать его. Без передачи аргументов этот код работает нормально.

Обновить

Теперь это работа. Спасибо @Евгений Анисюткин

 <?php
exec('C:\"Program Files"\R\R-4.0.3\bin\Rscript.exe C:\xampp\htdocs\chatchops\R_privatChat\R_TodayOnline.R ' . $ye . ' ' . $mon);
?>
 

В R

 args <- commandArgs(TRUE)
ye <- args[1]
mon <- args[2]
 

Комментарии:

1. Оба exec() и shell_exec() просто попробуйте выполнить все, что было предоставлено в виде $command строки, и у них обоих нет special way аргументов для передачи. Таким образом, в основном все аргументы, которые вы хотите передать выполняемой команде, должны содержаться в этом $command документе вместе с именем файла вашего R-скрипта. Имейте в виду , что вам на самом деле это нужно Pass arguments to r script from command line , потому что на стороне php все должно быть в этом надоедливом исполнителе, если вы, конечно, используете exec

2. @EugeneAnisiutkin Большое вам спасибо за этот ответ. Я не мог найти другого способа сделать это легко. Тем не менее, я не могу зарезервировать аргумент из R-скрипта. Я не знаю, что проблема возникает на стороне PHP или на стороне R>

3. вы всегда можете достаточно легко проверить php — что-то в этом роде <?php $test = 'It works'; exec("echo $test > test.txt"); ?> или что-то в этом роде, я должен предупредить вас, что это очень быстрый и очень грязный способ проверки того, действительно ли exec() он делает то, что должен делать. Не могу помочь вам с R, хотя) на самом деле ничего об этом не знаю. Но если скрипт вообще запускается — то, скорее всего, это не проблема php

4. @EugeneAnisiutkin Спасибо, братан. Я думаю, что проблема в стороне R.

5. Нет, сейчас это php-сторона — присмотрелся повнимательнее. Что я хочу сказать своим первым комментарием, так это то, как должен выглядеть звонок exec('C:\"Program Files"\R\R-4.0.3\bin\Rscript.exe C:\xampp\htdocs\chatchops\R_privatChat\R_TodayOnline.R ' . $ye . ' ' . $mon); . Обратите внимание, что здесь вся команда представляет собой одну строку. exec() на самом деле есть второй и третий аргумент. Второй аргумент используется для хранения результата выполненной команды, а третий хранит код результата. Более подробное описание можно найти в Руководстве