You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python控制台无需rpy2原生运行R脚本?附示例

在Python控制台运行R脚本(无需rpy2)

首先得明确一点:原生Python控制台没办法直接像执行Python代码那样跑R脚本——毕竟是两种完全不同的编程语言,各自有独立的解释器。不过不用慌,我们可以通过调用系统里的R解释器来间接运行你的R代码,下面是两种实用的方案,完全不需要依赖rpy2:

方案1:把R代码存成脚本文件,用Python调用执行

这是最稳妥的通用方法,只要你的电脑已经装了R,并且Rscript命令能在终端正常运行就行。

步骤:

  1. 先把你提供的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)
  1. 打开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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:14:01