使用Python导入R脚本的输出

问题描述

我在此stackoverflow中的第一篇文章! :)

我正在尝试使用Python导入表(R脚本的输出)。 避免翻译为设计R中的复杂data.table的庞大脚本而工作。

现在我知道如何使用以下代码使用Python调用R脚本:

import os 
import subprocess
 
#Launch selected script
command = 'C:/Program Files/R/R-3.4.0/bin/x64/Rscript.exe'
path2script = 'C:/mypath/myscript.R'
cmd = [command,path2script]
a = subprocess.call(cmd)

但是后来我不知道如何使用我的Python脚本使用表格,R代码输出。你有什么主意吗?

非常感谢

编辑:

我尝试了以下@punter的解决方

import subprocess

with subprocess.Popen(['/command/to/run','/other/parameters'],stdout=subprocess.PIPE) as proc:
    table = proc.stdout.read()

但是表格是这样的奇怪格式:(它是一个子集)

A\r\n COL1 COL2 COL3\r\n 1: 2015-06-17 05:19 NA <NA>\r\n 2: 2015-06-17 05:19 NA <NA>\r\n 3: 2015-06-17 05:19 NA <NA>\r\n 4: 2015-06-17 05:19 NA <NA>\r\n 5: 2015-06-17 05:19:29 NA <NA>\r\n 

当我尝试下面的代码时,我会在列名称中得到所有内容

s=str(table) 
data = StringIO(s) 
df=pd.read_csv(data)

[0行x 111列]

编辑数字2

在str(table,“ ISO-8859-1”)中像str(table,“ ISO-8859-1”)一样在str中尝试使用此“ ISO-8859-1”似乎可以,并且我注意到脚本中有多个表。 我正在以一种干净的方式重新运行一切,希望它能正常工作! :)

解决方法

对于一般的任何进程,可以按以下方式捕获标准输出:

postgres

这是一个阻塞调用,这意味着执行将在table = proc.stdout.read()处停止。

注意 上面的代码可能无法满足大型表的要求,因为该过程将在很长一段时间内阻塞在上面显示的行。

,

我来看看r2py界面。这使您可以从R转换为熊猫对象:https://pandas.pydata.org/pandas-docs/version/0.22.0/r_interface.html

您可以将表存储在RData文件中,然后将其加载到python中。

,

考虑将R脚本调整为使用write.csv()作为最后一行,而没有将文件转储到控制台。这将允许引用字符串值。然后在Python中,使用subprocess.Popen接收带有字节处理的输出,以移植到Pandas数据帧中。

R

...

write.csv(my_r_df,file="",row.names=FALSE)

Python

import subprocess
from io import StringIO
import pandas as pd
 
# RUN R SCRIPT
command = r'C:\Path\To\Rscript.exe'
path2script = r'C:\Path\To\R\Code.R'

a = subprocess.Popen([command,path2script],stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
                      
output,error = a.communicate()

# IMPORT PANDAS DATA FRAME
my_pandas_df = pd.read_csv(StringIO(output.decode('utf-8')))

my_pandas_df

当然,您也可以让R只需将数据写入.csv,然后导入到Pandas中。

,

您可以将R数据帧复制到剪贴板,然后使用“从剪贴板读取”将其加载到Pandas。这是它的工作原理。

使用此代码将R数据帧复制到剪贴板,然后转到Jupyter并使用pd.read_clipboard()。

# If you are on Windows,use:
# R-Studio
write.table(df,"clipboard",sep="\t",col.names=TRUE)

# Jupyter
df = pd.read_clipboard(sep="\t")

# On Mac,use:
# R-Studio
clip <- pipe("pbcopy","w")                       
write.table(df,file=clip)                               
close(clip)

# Jupyter Notebook
df = pd.read_clipboard()