在Python中更改R脚本变量,然后保存回R脚本

时间:2014-03-07 17:21:53

标签: python r rpy2

我想在R脚本文件中读入Python(使用Tkinter GUI包)并更改一些变量(或者只是打印和播放它们),然后将这些变量重新保存回R脚本文件。我正在看看Rpy2模块,但我没有看到任何可以帮助我实现这一目标的东西。我想要更改的变量是字符串和数字变量(在R中)。

例如:

R脚本包含:

eventtime<-"18:30:00"   
eventdate<-"2014-02-28" 

Python文件:

import Tkinter as tk
from rpy2.robjects import r

class GUI(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master, width=300, height=200)
        self.master = master
        self.master.title('GUI')

        self.pack_propagate(0)
        self.pack()

        self.run_button = tk.Button(self, text='Run', command=self.evaluate)
        self.run_button.pack(fill=tk.X, side=tk.BOTTOM)

        self.entrybox_frame = tk.Frame(self)
        self.entrybox_frame.pack(anchor=tk.S, pady=5)

        self.eventtime_var = tk.StringVar()
        self.eventtime = tk.Entry(self.entrybox_frame, textvariable=self.eventtime_var)
        self.eventdate_var = tk.StringVar()
        self.eventdate = tk.Entry(self.entrybox_frame, textvariable=self.eventdate_var)

        self.eventtime.grid(row=0, column=1)
        self.eventdate.grid(row=1, column=1)

    def evaluate(self):
        # Clicking the Run button will save the variables to the R script
        r.source('file.r')
        self.get_event_info()

    def run(self):
        self.mainloop()

    def get_event_info(self):
        # Get the user input and write them to the R variables
        # So first must read the R script into python, then rewrite over those variables 
        # Then save the R script
        print self.eventtime_var.get()
        print self.eventdate_var.get()

gui = GUI(tk.Tk())
gui.run()

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

最好不要将变量硬编码到脚本中,而是将它们作为Rscript中的可能参数传递,或者在源代码(需要它们)之前将它们设置在R环境中。

使用位置错误解释R脚本

关于 passing arguments (as your variables) 对于脚本,您可以在SO上找到一些已经回答的问题。 上面的链接只是一个启动器。

R-intro B.4使用R编写脚本是官方来源。

Rpy2更改R环境中的对象

您可以在获取rscript之前在R环境中设置或更改(by Rpy2 means)变量,这将使用已设置的变量,因此脚本必须准备好不设置它们而只是使用它们。

答案 1 :(得分:0)

rpy2提供了一种更好的方法来处理R脚本,方法是将其封装到Python端的命名空间中,以及R端的环境中。

检查relevant section of the rpy2 documentation