我正在编写一个R包,除其他外,它定义了一个实际上是PHP脚本包装器的函数。让我们假设PHP脚本提供了一些在R中很难重新创建的功能,而且我的推理(在R中包装PHP脚本)是有道理的。
我目前正在将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函数调用它(对于C可执行文件,如.Call
)?
答案 0 :(得分:0)
有很多方法可以做到这一点。您可以将函数硬编码到脚本中,将其写入文件,通过带有参数的函数wrapper
运行它(创建文件时隐含路径)并在之后进行清理。
更好的方法可能是将脚本放入/data
并通过?system.file
调用。
答案 1 :(得分:0)
可能/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 ...