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

1 投票
2 回答
1370 浏览
提问于 2025-04-17 21:19

我想把一个R脚本文件读到Python里(使用Tkinter这个图形界面包),然后修改一些变量(或者只是打印出来玩玩),最后再把这些变量保存回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

rpy2 提供了一种更好的方法来处理 R 脚本,它可以把 R 脚本封装在 Python 的命名空间中,同时在 R 的环境中也进行封装。

可以查看 rpy2 文档中相关的部分

2

与其把变量直接写死在脚本里,不如把它们作为位置参数传递给R脚本,或者在运行脚本之前先在R环境中设置好这些变量。

使用位置参数解释R脚本

关于如何将参数(也就是你的变量)传递给脚本,你可以在StackOverflow上找到一些已经回答过的问题。上面的链接只是一个入门参考。

R-intro B.4部分讲解了如何使用R进行脚本编写,这是官方的资料来源。

Rpy2在R环境中修改对象

你可以在运行rscript之前,通过Rpy2来设置或修改R环境中的变量,这样脚本就可以使用已经设置好的变量。因此,脚本应该准备好只使用这些变量,而不是重新设置它们。

撰写回答