将 R 转换为 ryp2

Converting R to ryp2

我正在尝试从 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)

这是我的 rpy2 代码,它绘制数据但不是 log10,而且 x 轴太小。

import rpy2.robjects as ro
from rpy2.robjects.packages import importr
r = ro.r
outputDir = '/dir'
r.setwd(outputDir)
f = r('read.table("allelefreqs.txt", header = FALSE)')
grdevices = importr('grDevices')
grdevices.png(file="alleleFreq.png", width=800, height=500)
r.hist(f[0], breaks=100, main = '5 Reads', xlab='Variant Freq', ylab='# Vars', log10='x')
grdevices.dev_off()

这里f是一个R数据框,本质上是一个R列表,其中所有元素都是R向量(每个元素在你的table中都是一个"column")和所有这些向量具有相同的长度。

f[0] 会 return 一个长度为 1 的列表,因为这是 R 会做的(R 有 [[[ - 直到今天我不确定 Python 端的 [ 是否应该表现得像 R 的 [[[ 但对于另一个线程)。 f.rx2(1) 会 return 你想要什么(请参阅 http://rpy2.readthedocs.org/en/version_2.7.x/vector.html#extracting-elements 处的 rpy2 和数据帧的文档,注意 R 序列是 1 偏移而 Python 向量是 0 偏移) .

您可以保持 R 命令几乎完好无损,但可以不同地处理 Python 之间的对象。考虑以下 rpy2 和 Rscript 命令行解决方案:

2元

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 的自动可执行文件 RScript.exe 通过命令行调用 R 脚本。您甚至可以将参数传递给 R 脚本,以便 R 与 commandArgs().

一起使用
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"))