Передача массива из php через командную строку в R - PullRequest
5 голосов
/ 04 августа 2011

У меня проблема, я выполняю R-скрипт из php через командную строку, и мне нужно дать ему два массива для расчета.

Я вызываю скрипт, запустив:

Rscript nls.R ??? ???

??? а также ??? мои массивы, которые мне нужно "дать" R, чтобы он вычислял определенные значения.

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

Как бы R поймал это, какой командой?

Большое спасибо.

Привет

Ответы [ 4 ]

4 голосов
/ 04 августа 2011

Предполагая, что вы хотите запустить R в процессе обслуживания веб-страницы, есть несколько лучших способов вызова R, чем из командной строки; проблема в том, что интерпретатор R запускается очень медленно, и вы тратите много времени и ресурсов процессора, чтобы запускать его снова и снова.

Например, вы можете создать небольшой R-сервер с triggr и пообщаться с ним с помощью клиента, созданного с помощью сокетов PHP.
Более простая, но более сложная идея - создать приложение rApache и либо поговорить с ним с помощью CURL, либо использовать его непосредственно в качестве AJAX или даже поставщика HTML.

4 голосов
/ 04 августа 2011

Команда, которую вы ищете: commandArgs().

Теперь, если у вас есть, например, список целых чисел, разделенных запятыми в строке, вы можете получить целые числа

s = '1,2,3,4,5'
your_list = lapply(strsplit(s, ','), as.numeric)[[1]]

Возможно, есть более простые способы достижения этого.

EDIT:

лучший пример (также должен работать с Rscript)

$ R "1,2,3,4,5"
...

>lapply(strsplit(commandArgs()[[2]], ','), as.numeric)[[1]]
[1] 1 2 3 4 5
3 голосов
/ 04 августа 2011

Вам нужно будет адаптировать свой R-скрипт и включить вызов на commandArgs(). При использовании с параметром trailingOnly=TRUE он вернет символьный вектор с разделенными пробелом аргументами после вызова. Это позволит вам в дальнейшем манипулировать аргументами.

С учетом скрипта myscript.r:

#My script
x <- commandArgs(trailingOnly=TRUE)
print(x)
print(str(x))

Вы можете позвонить из командной строки Rscript myscript.r 1 2 3 и получить

Loading required package: ...
...
[1] "1" "2" "3"
 chr[1:3] "1" "2" "3"
NULL

F:\Temp

Это дает вам возможность передавать имена текстовых файлов с вашими массивами в Rscript. Если я комбинирую разные языки, я обычно использую текстовые файлы для сохранения промежуточных результатов, это делает все немного более плавным.

Осторожно, если вы используете какой-либо из параметров Rscript (например, --no-save), вы должны поместить их перед сценарием, например, Rscript --no-save myscript.r

2 голосов
/ 04 августа 2011

Вы не можете передать такие вещи (ну, не легко) на Rscript. Rscript имеет параметр -e, из которых может быть более одного, которые являются R-выражениями. Таким образом, вы можете заставить PHP создавать символьную строку, которая является выражением R, создающим ваши массивы, и передавать каждое выражение для создания массива через отдельные -e аргументы.

Вы также можете передать в командной строке аргументы, которые функция R commandArgs() может получить и сделать доступной для вас. См. Пример здесь , но вам, возможно, придется поиграться с тем, как аргументы передаются и оцениваются R.

В зависимости от размера массивов, приведенное выше, скорее всего, не будет полезным. В этом случае вам придется искать другие способы связи с R, чем через Rscript.

...