如何在Python控制台无需rpy2原生运行R脚本?附示例
在Python控制台运行R脚本(无需rpy2)
首先得明确一点:原生Python控制台没办法直接像执行Python代码那样跑R脚本——毕竟是两种完全不同的编程语言,各自有独立的解释器。不过不用慌,我们可以通过调用系统里的R解释器来间接运行你的R代码,下面是两种实用的方案,完全不需要依赖rpy2:
方案1:把R代码存成脚本文件,用Python调用执行
这是最稳妥的通用方法,只要你的电脑已经装了R,并且Rscript命令能在终端正常运行就行。
步骤:
- 先把你提供的R代码保存成一个
.R文件,比如叫car_analysis.R。这里我给代码加了一点小修改,确保在非交互式环境下能正常输出结果:
mydat=read.csv("C:/Users/Admin/Downloads/test.csv", sep=";",dec=",") # View()在非交互式环境不会弹窗,换成打印前几行查看数据 print(head(mydat)) str(mydat) # 移除不需要的列 mydat$symboling.<-NULL mydat$make.<-NULL mydat$num.of.cylinders.<-NULL mydat$fuel.type.<-NULL mydat$aspiration.<-NULL mydat$num.of.cylinders.<-NULL # 特征选择 library("Boruta") FS=Boruta(normalized.losses.~.,data=mydat) # 显式打印选中的特征 print("Selected Attributes:") print(getSelectedAttributes(FS, withTentative = F)) # 保存Boruta绘图(非交互式环境不会弹窗,存成图片) png("boruta_feature_plot.png") plot(FS, cex.axis=0.5) dev.off() # 保存散点图 png("length_vs_losses.png") scatter.smooth(x=mydat$length.,y=mydat$normalized.losses.,main="normalized losses~length") dev.off() # 划分训练测试集 index <- sample(1:nrow(mydat),round(0.70*nrow(mydat))) train <- mydat[index,] test <- mydat[-index,] # 构建线性回归模型 mymodel=lm(normalized.losses.~.,data=train) print("\nModel Summary:") print(summary(mymodel)) print("\nModel AIC:") print(AIC(mymodel)) # 训练集预测与结果 pred.tr=predict(mymodel,train) actual_pred.tr=data.frame(cbind(actual=train$normalized.losses.,predicteds=pred.tr)) print("\nTrain Set Actual vs Predicted:") print(actual_pred.tr)
- 打开Python控制台,用
subprocess模块调用这个R脚本:
import subprocess # 替换成你的.R文件的实际路径 script_path = "C:/path/to/your/car_analysis.R" # 调用Rscript执行脚本,捕获输出 run_result = subprocess.run( ["Rscript", script_path], capture_output=True, text=True ) # 打印R脚本的正常输出 print("=== R Script Output ===") print(run_result.stdout) # 如果有错误信息,打印出来排查问题 if run_result.stderr: print("\n=== Error Messages ===") print(run_result.stderr)
运行这段Python代码后,你就能在Python控制台里看到所有R代码的输出,同时生成的两张图片会保存在脚本所在的目录里。
方案2:直接把R代码作为字符串传递给Rscript(无需存文件)
如果你不想单独存R脚本文件,也可以把R代码写成Python字符串,直接传给Rscript -e命令执行:
import subprocess # 把你的R代码写成Python字符串,注意调整输出和绘图逻辑 r_code = ''' mydat=read.csv("C:/Users/Admin/Downloads/test.csv", sep=";",dec=",") str(mydat) mydat$symboling.<-NULL mydat$make.<-NULL mydat$num.of.cylinders.<-NULL mydat$fuel.type.<-NULL mydat$aspiration.<-NULL mydat$num.of.cylinders.<-NULL library("Boruta") FS=Boruta(normalized.losses.~.,data=mydat) print("Selected Attributes:") print(getSelectedAttributes(FS, withTentative = F)) # 保存绘图 png("boruta_plot.png") plot(FS, cex.axis=0.5) dev.off() png("scatter_plot.png") scatter.smooth(x=mydat$length.,y=mydat$normalized.losses.,main="normalized losses~length") dev.off() index <- sample(1:nrow(mydat),round(0.70*nrow(mydat))) train <- mydat[index,] test <- mydat[-index,] mymodel=lm(normalized.losses.~.,data=train) print("\nModel Summary:") print(summary(mymodel)) print("\nModel AIC:") print(AIC(mymodel)) pred.tr=predict(mymodel,train) actual_pred.tr=data.frame(cbind(actual=train$normalized.losses.,predicteds=pred.tr)) print("\nTrain Set Actual vs Predicted:") print(actual_pred.tr) ''' # 调用Rscript执行代码字符串 run_result = subprocess.run( ["Rscript", "-e", r_code], capture_output=True, text=True ) print(run_result.stdout) if run_result.stderr: print("\nErrors:", run_result.stderr)
几个关键注意点:
- 确保你的系统已经安装了R,并且
Rscript命令能在终端(CMD/终端)正常运行(可以先在终端输入Rscript --version测试) - R的
View()命令在非交互式环境下不会弹出窗口,需要换成print(head(mydat))之类的命令查看数据 - R的绘图命令(比如
plot())在非交互式环境下不会显示弹窗,必须用png()/jpeg()等命令把图保存成文件才能查看 - 所有需要输出的变量,都要显式调用
print(),不然Rscript不会自动输出
内容的提问来源于stack exchange,提问作者psysky
相关产品推荐
相关产品推荐

