【问题标题】:Sourcing r-files only once on Rserve仅在 Rserve 上采购 r 文件一次
【发布时间】:2012-11-25 17:17:47
【问题描述】:

我编写了一个小型 Java 客户端,它在 Rserver 上进行一些计算。为此,服务器端有functions.r- 和libraries.r 文件,必须先获取源文件,然后才能进行实际计算。

目前我在每个新连接上加载文件:

import org.rosuda.REngine.Rserve.RConnection;

public class RserveTester {

  public void doOnRserve() {
    RConnection c = new RConnection( "rserve.domain.local" );
    c.login( "foo", "user" );
    c.eval("source(\"/home/rserve/lib/libraries.r\")");
    c.eval("source(\"/home/rserve/lib/functions.r\")");
    c.eval( "someCalculation()" )
    c.close();
  }  
}

doOnRserve() 在一分钟内由于客户端发生几次事件而被调用。

我的问题是:是否有可能只采购一次库,以便在所有新的 RSession 期间都可以使用它们而无需单独采购?

我在客户端尝试过类似的东西:

c.serverSource("/home/rserve/lib/libraries.r" )
c.serverSource("/home/rserve/lib/functions.r" )

这给了我以下异常(不知道为什么这不起作用eval 确实):

 org.rosuda.REngine.Rserve.RserveException: serverSource failed, request status: access denied (local to the server)

我可以使用特定的.Rprofile 启动 Rserve 吗?

编辑:

基本上,有三种可能的方法:

  1. 让 /home/rserve/.Rprofile 获取 .r 文件。但是每次我打电话给new RConnection()时,这个接缝都可以找到它们
  2. 在启动 Rserve 时将源命令直接传递给 R(不知道如何执行此操作)。
  3. 我的首选方法:使用 serverSource() 从客户端执行此操作,这会引发这些“拒绝访问”异常。

EDIT2:

保留版本 v0.6-8 (338)

适用于 x86_64-pc-linux-gnu 的 R 版本 2.15.2。

【问题讨论】:

    标签: java r rserve


    【解决方案1】:

    这可以通过在配置文件中添加source 行来轻松完成,即,将

    source "/foo/bar.R"
    

    /etc/Rserv.conf 中将在启动时获取/foo/bar.R。如果要使用另一个配置文件,请使用--RS-conf 命令行参数来指定它。最后,Rserve 1.x 还支持命令行中的--RS-source 选项。

    如果文件路径中没有引号,可能会出现File Not Found Error。

    顺便说一句:您提到serverSource() access denied - 这意味着您没有在 Rserve 中启用控制命令(配置中的control enable 或命令行中的--RS-enable-control)。

    PS:Rserve 问题请使用 stats-rosuda-devel 邮件列表。

    【讨论】:

    • 谢谢,但关于serverSource,您提到的两种方法都不起作用:使用R CMD Rserve --RS-enable-control --RS-conf ~/control/Rserve.conf 启动守护程序会在启动时发出警告:“警告:未知选项'--RS-enable-控制'”。将control enable 添加到(我的本地)Rserve.conf 不会发出警告,但我仍然收到 Java 异常:“serverSource failed, request status: access denied (local to the server)”
    • 如果 --RS-enable-control 无法识别,那么您使用的是不支持它的旧 Rserve(可能是 0.x 系列)。至于control enable - 请运行调试版本以确保您已正确设置配置,以便显示已识别的标志。另请注意,如果您使用用户身份验证,则必须指定允许发出控制命令的用户(请参阅文档)。
    • 很抱歉,但我花了一些时间才回来。是的,你是对的,我已经安装了 0.x 系列。非常感谢,这很有帮助。
    【解决方案2】:

    是的,你可以。永远记住这一点:

    R> fortunes::fortune("Yoda")
    
    Evelyn Hall: I would like to know how (if) I can extract some of the information 
                 from the summary of my nlme.
    Simon Blomberg: This is R. There is no if. Only how.
       -- Evelyn Hall and Simon 'Yoda' Blomberg
          R-help (April 2005)
    
    R> 
    

    或如Rserve 的文档所述:

    \description{ 以守护程序模式启动 Rserve(仅限 unix)。

    任何额外的 与 Rserve 无关的参数将直接传递给 底层 R. 用于配置、使用和命令行参数 请查阅在线文档 http://www.rforge.net/Rserve。使用 \code{R CMD Rserve --help} 作为 简短的帮助。

    【讨论】:

    • 我真的很抱歉,但这对我没有任何帮助(我确实阅读了整个 RServe 文档)。也许只是因为我不知道如何将源命令“直接传递给底层 R”。我尝试将source 命令添加到 Rserve.conf 中,但没有结果。我创建了一个.Rprofile,但是每次我创建一个新的RConnection 时仍然调用source 命令。另外,当我让 Rserve 由 start-stop-script 启动时,不会加载 .Rprofile。
    • 抱歉,当通过 start-stop-script 启动守护进程时,忘记不工作的 .Rprofil。那是我的错。
    • 我们或许应该编辑问题和/或答案以记录一种简单的工作方式。你选了什么? RHOME/etc/Rprofile ?每个启动目录 .Rprofile ?
    • 我编辑了我的问题,使可能的解决方案希望更清晰。
    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2014-10-15
    相关资源
    最近更新 更多