Php R扩展:在包中调用外部脚本

Php R扩展:在包中调用外部脚本,php,r,Php,R,我正在编写一个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 <-

我正在编写一个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)

}
但是这个解决方案很糟糕——只有在当前工作目录中有PHP脚本时,系统调用才会起作用

我将包装器保存在一个
~/simple\u package/R/wrapper.R
文件中,但我不确定将PHP脚本存储在哪里


我是否应该将PHP文件保存在
~/simple\u package/src
目录中,然后使用一些专用的R函数调用它(例如
.call
用于C可执行文件)?

有很多方法可以做到这一点。您可以将函数硬编码到脚本中,将其写入文件,通过带有参数的函数
包装器运行它(创建文件时路径是隐式的),然后进行清理


更好的方法可能是将脚本放入
/data
,并通过
?system.file

调用它。有多种方法可以做到这一点。您可以将函数硬编码到脚本中,将其写入文件,通过带有参数的函数
包装器运行它(创建文件时路径是隐式的),然后进行清理


更好的方法可能是将脚本放入
/data
并通过
?system.file调用它

可能
/data
不是包脚本的最佳选择,
/exec
可能是更好的选择

见:

你也可以考虑使用<代码> Stult2:

对于某些语言(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 ...
#/bin/env Rscript

args可能
/data
不是包脚本的最佳选择,
/exec
可能是更好的选择

见:

你也可以考虑使用<代码> Stult2:

对于某些语言(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 ...
#/bin/env Rscript

真管用!与我最初尝试的
src
目录不同,
data
目录是“持久的”(复制到包的安装目录中)。它工作了!与我最初尝试的
src
目录不同,
data
目录是“持久的”(复制到软件包的安装目录)。实际上,这更合适。似乎
脚本
目录(文件夹?)在Windows中不是持久的。但是
exec
(正如hute37在他的回答中所建议的那样)目录/文件夹是持久的。我对此进行了测试,似乎没有,不是所有的二级目录都是持久的,即使它们不是空的。事实上,这更合适。似乎
脚本
目录(文件夹?)在Windows中不是持久的。但是
exec
(正如hute37在他的回答中所建议的)目录/文件夹是持久的。我对此进行了测试,似乎不是所有的二级目录都是持久的,即使它们不是空的。