【问题标题】:R extensions: calling an external script within a packageR 扩展:在包中调用外部脚本
【发布时间】:2016-05-11 00:17:33
【问题描述】:

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

【问题讨论】:

  • 确实这样更合适。
  • 似乎scripts 目录(文件夹?)在 Windows 中不是持久的。但是exec(正如 hute37 在他的回答中所建议的那样)目录/文件夹是持久的。
  • 我测试过,似乎不是,不是所有的二级目录都是持久的,即使它们不是空的。

标签: php r


【解决方案1】:

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

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

【讨论】:

  • 成功了!与我最初尝试的src 目录不同,data 目录是“持久的”(复制到包的安装目录中)。
【解决方案2】:

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

见:

您也可以考虑使用system2:

对于某些语言(Python),CRAN 中有一些特殊的支持


一个例子(使用systemsystem.file):

它由 external 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 ...

【讨论】:

    猜你喜欢
    • 2012-12-25
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2012-07-21
    相关资源
    最近更新 更多