Я пишу R-пакет, который, помимо прочего, определяет функцию, которая на самом деле является оберткой для скрипта PHP. Давайте предположим, что PHP-скрипт предлагает некоторую функциональность, которую довольно сложно воссоздать в R, и что моя аргументация (обертывание PHP-скрипта в R) имеет смысл.
В настоящее время я храню скрипт PHP в отдельном файле и запускаю его с помощью системного вызова.
Моя R-функция / обертка выглядит так:
wrapper <- function() {
# I'm not entirely sure what the path to the PHP file should be
php_file_name <- "magic_in.php"php_script_argument <- "hello, world"
system_call <- sprintf('php -f "%s"', php_file_name, php_script_argument)
system(system_call)
}
в то время как magic_in.php
Файл следующий:
<?php
print($argv[1]."\n")
?>
Но это решение отстой — системный вызов работает, только если у меня есть скрипт PHP в моем текущем рабочем каталоге.
Я держу обертку в ~/simple_package/R/wrapper.R
файл, но я не уверен, где хранить скрипт PHP.
Должен ли я хранить файл PHP в ~/simple_package/src
каталог, а затем вызвать его с помощью некоторой выделенной функции R (например, .Call
для исполняемых файлов C)?
Наверное /data
не лучший вариант для пакетных скриптов, /exec
может быть лучшим выбором.
Увидеть:
Вы также можете рассмотреть возможность использования system2
:
Для некоторых языков (Python) в CRAN есть специальная поддержка
Пример (используя system
а также system.file
):
Это выполнено внешний R скрипт командной строки:
#!/bin/env Rscript
args <- commandArgs(TRUE)
if( length(args) < 2 ){
stop( "usage : R CMD execute package script [parameters]\n" )
}
package <- args[1]
script <- args[2]
scriptfile <- file.path( system.file( "exec", script, package = package ) ) # <= path
if( !file.exists( scriptfile ) ){
stop( sprintf( "file not found: '%s' ", scriptfile ) )
}
trail <- if( length(args) > 2 ) paste( tail( args, -2 ), sep = " " ) else ""cmd <- sprintf( '"%s" %s', scriptfile, trail )
system( cmd ) # <= or system2 ...
Есть несколько способов сделать это. Вы можете жестко закодировать функцию в сценарии, записать ее в файл, запустить через функцию wrapper
с аргументами (путь неявный при создании файла) и очистка впоследствии.
Лучшим подходом, вероятно, было бы поместить сценарий в /data
и позвонить через ?system.file
,