我试图用rsruby连接ruby和r。
在我的应用程序控制器中,我有以下功能:

def InitR
    @r = RSRuby.instance
    return @r
end

当我做出:
@r = InitR()

它在浏览器中引发以下问题:未找到r函数“get”
在控制台上显示:
NoMethodError (R Function "get" not found):
  app/controllers/application_controller.rb:6:in `InitR'
  app/controllers/diagnostic_controller.rb:32:in `generatePdf'

我试图改变堆栈限制,正如我在一些帖子中看到的,但它似乎什么也没做。
有人知道吗?
这就是我的代码在applicationcontroller中的显示方式。
class ApplicationController < ActionController::Base
  protect_from_forgery

  # Make R instance available to all
  def initR
    @r = RSRuby.instance
  end

 end

这里是diagnosticcontroller,我想在这里使用这个实例:
def generatePdf
    project = Project.find(session[:project_id])

    pdf = Prawn::Document.new

    sentence = RSentence.find_by_name("library").content.gsub("LIBRARY", "lattice")

    pdf.text sentence

    pdf.render_file project.name.to_s + ".pdf"

    @r = initR
    @r.eval_R(sentence)

    redirect_to :controller => "diagnostic", :action => "index"
  end

调用rsruby.instance时引发异常

最佳答案

这里有几个问题。
你在def中使用了大写,initr-应该是initr
您正在尝试将实例变量设置为自身,即在initr方法的内部和外部。
尝试

def initR
  @r = RSRuby.instance
end

然后调用initr,它将实例化@r
您可以使用@r例如@r.wilcox_text([1,2,3],[4,5,6])
好的,更新之后,initr函数看起来已经失效。设置@r = initR,就像是说@r = @r = RSRuby.instance,例如,您已经调用它两次。如果要使用函数,请将其更改为
def initR
  RSRuby.instance
end

然后您可以致电@r = initR
此外,它还查看错误是否与r本身有关,即错误不是ruby错误,而是r错误。如果您尝试在rails控制台中运行generate函数中的步骤,这可能会突出显示哪个步骤失败。

08-28 05:01