Расширения R: вызов внешнего скрипта в пакете

Я пишу 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)?

1

Решение

Наверное /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 ...
0

Другие решения

Есть несколько способов сделать это. Вы можете жестко закодировать функцию в сценарии, записать ее в файл, запустить через функцию wrapper с аргументами (путь неявный при создании файла) и очистка впоследствии.

Лучшим подходом, вероятно, было бы поместить сценарий в /data и позвонить через ?system.file,

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector