【问题标题】:How to call R script from PHP?如何从 PHP 调用 R 脚本?
【发布时间】:2018-01-22 15:21:49
【问题描述】:

我有一堆 R scripts 进行一些计算并返回结果。我正在计划建立一个 PHP 网站,用户实际上可以提交一个表单,其中数据被传递到我的 R 脚本,处理然后将结果返回给 PHP 并更新界面。

计划是有一个数据库,所以当用户提交表单时,数据会存储在数据库中,以便 R 可以读取、处理输入,然后将结果插入数据库中,以便 PHP 可以获取它。但是,有两个问题:

  1. 我的 R 脚本如何知道某些值已存储在数据库中,以便获取这些值并进行处理?
  2. 当我的 R 脚本处理完数据并插入到 mysql db 时,我如何让 PHP 理解此时 PHP 需要查询数据库并获取值?

假设我的 R 脚本如下所示:

range<-1:20
m<-mean(range)
s<-sum(range)
print(m)
print(s)

如您所见,在这种情况下,输入是120 来定义范围,输出是在我的网页上显示ms 的值。

知道如何实现吗? 谢谢!

【问题讨论】:

    标签: php mysql r


    【解决方案1】:

    shell_exec()exec() 可能是您在 PHP 中的最佳选择。 This answer explains the difference.

    echo shell_exec("Rscript my_script.R {$_GET['range']}");
    

    【讨论】:

    • 那我这里不用mysql数据库了吧?
    • 如果您需要输入在页面加载时保持不变,则将输入存储在数据库中。如果每次调用中都有大量数据,并且您使用数据库作为在语言之间保存数据的一种方式,那么很好(但这在问题中并不清楚)。如果数据只是传递且简短,则没有理由涉及数据库。
    • 感谢您的回复.. 这很有帮助
    • 除非你总是使用escapeshellarg() 来转义用户输入:echo shell_exec("Rscript my_script.R " . escapeshellarg($_GET["range"]));
    【解决方案2】:

    我不是专家,但已经完成了: /poorman.php

    echo "
    ";
    echo "Number values to generate: 
    ";
    echo "Submit";
    echo ""
    ;
    
    if(isset($_GET['N']))
    {
      $N = $_GET['N'];
    
      // execute R script from shell
      // this will save a plot at temp.png to the filesystem
      exec("Rscript my_rscript.R $N");
    
      // return image tag
      $nocache = rand();
      echo("");
    }
    ?>
    

    还有 R 脚本……

    my_rscript.R

    args <- commandArgs(TRUE)
    
    N <- args[1]
    x <- rnorm(N,0,1)
    
    png(filename="temp.png", width=500, height=500)
    hist(x, col="lightblue")
    dev.off()
    

    source

    【讨论】:

    • 基本上,你是在告诉我,我根本不需要数据库?
    • 可以直接执行r脚本,是的。
    • 在源代码中,他们提到一次只能有一个用户使用这个网络应用程序。我知道因为 R 脚本将忙于处理输入。我的脚本如何处理并发请求?
    • 我不确定这个解决方案,但也许每次我们生成一个 R 脚本并且一旦完成我们就删除它?
    • @Riad re concurrency:我建议尝试一下,看看是否有问题,如果有问题,然后再打开一个不同的问题? (包括您的代码!)您可能会发现这根本不是问题。
    猜你喜欢
    • 2014-03-18
    • 2011-01-31
    • 2011-04-13
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    相关资源
    最近更新 更多