Python 将R转换为ryp2

Python 将R转换为ryp2,python,r,rpy2,Python,R,Rpy2,我试图在python脚本中运行一些R代码。要做到这一点,我使用rpy2,但有困难(也可以调用R脚本,但我也不能让它工作)。下面是我希望它执行的R脚本代码: library(ggplot2) setwd("/dir/") allelefreqshort <- read.table("allelefreqsshort.txt", header = TRUE) hist(log10(allelefreqshort$AlleleFreq), xlim = c(-15,0), breaks=20)

我试图在python脚本中运行一些R代码。要做到这一点,我使用rpy2,但有困难(也可以调用R脚本,但我也不能让它工作)。下面是我希望它执行的R脚本代码:

library(ggplot2)
setwd("/dir/")
allelefreqshort <- read.table("allelefreqsshort.txt", header = TRUE)
hist(log10(allelefreqshort$AlleleFreq), xlim = c(-15,0), breaks=20)

这里的
f
是一个R数据帧,它本质上意味着一个R列表,其中所有元素都是R向量(每个元素都是表中的“列”),并且所有这些向量都具有相同的长度


执行
f[0]
将返回一个长度为1的列表,因为这是R将要做的事情(R有
[
[
-到今天为止,我还不确定Python端的
[
是否应该像R的
[
一样,但对于另一个线程是这样)。
f.rx2(1)
将返回您想要的结果(参见RPY2的DOC和数据帧,记住R序列是1偏移,而Python向量是0偏移)。可以保持R命令非常完整,但是在Python之间处理不同的对象。考虑下面的Rpy2和RScript命令行解决方案:

RPY2

import os
import rpy2
import rpy2.robjects as ro
from rpy2.robjects.packages import importr

# CURRENT DIRECTORY OF SCRIPT
cd = os.path.dirname(os.path.abspath(__file__))

# READ IN DATA
allelefreqshort_py = ro.r['read.table'](os.path.join(cd, "allelefreqs.txt"), header=False)

# PASSING PYTHON DF TO R DF
ro.globalenv['allelefreqshort'] = allelefreqshort_py

# OUTPUT PLOT
grdevices = importr('grDevices')
grdevices.png(file="alleleFreq.png", width=800, height=500)
p = ro.r('hist(log10(allelefreqshort$AlleleFreq), xlim = c(-15,0), breaks=20)')
grdevices.dev_off()
RScript

或者,您可以运行子流程,并使用R的自动可执行文件通过命令行调用R脚本。您甚至可以将参数传递到R脚本中,以便R与
commandArgs()
一起使用


为什么你不能在调用
r.hist
时设置
xlim
?log(f[0])给了我一个错误,我无法让xlim在r.hist中正常工作。也许
将numpy导入为np
然后
np.log(f[0])
?什么是
类型(f[0])
import os
import rpy2
import rpy2.robjects as ro
from rpy2.robjects.packages import importr

# CURRENT DIRECTORY OF SCRIPT
cd = os.path.dirname(os.path.abspath(__file__))

# READ IN DATA
allelefreqshort_py = ro.r['read.table'](os.path.join(cd, "allelefreqs.txt"), header=False)

# PASSING PYTHON DF TO R DF
ro.globalenv['allelefreqshort'] = allelefreqshort_py

# OUTPUT PLOT
grdevices = importr('grDevices')
grdevices.png(file="alleleFreq.png", width=800, height=500)
p = ro.r('hist(log10(allelefreqshort$AlleleFreq), xlim = c(-15,0), breaks=20)')
grdevices.dev_off()
import subprocess

# CURRENT DIRECTORY OF SCRIPT (ASSUMING R SCRIPT IN SAME DIRECTORY)
cd = os.path.dirname(os.path.abspath(__file__))

# COMMAND LINE ARGUMENTS (IF RSCRIPT.EXE IS PATH VARIABLE, LEAVE OUT DIRECTORY)
cmd = ["path/to/RScript", os.path.join(cd, "HistPlotScriptName.R")]

# SUBPROCESS CALL
a = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE,
                     stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output,error = a.communicate()

# R CONSOLE OUTPUT PRINTED TO PYTHON CONSOLE
if a.returncode == 0:               # SUBPROCESS SUCCESSFUL
    print(output.decode("utf-8"))
else:                               # SUBPROCESS FAILED
    print(error.decode("utf-8"))