R中的Python代码集成:在开发时工作,但在发布后不工作

时间:2016-05-17 17:19:21

标签: r rpython

我正在RStudio平台上开发一个R包。我有许多用python编写的函数,我想用R调用。现在我只为DNA序列实现了一个简单的反向补码函数。在RStudio上编写和构建项目时,代码工作正常。一旦我在github上发布它并从repo安装在其他机器上,它就会成功安装,但是当我调用该函数时它无法运行。详情如下:

$ cat rev.py

def revcompl (s):
    rev_s = ''.join([{'M':'M', 'A':'T','C':'G','G':'C','T':'A'}[B] for B in s][::-1]).replace ("CM","MG")
    return rev_s

$ cat reverse_complement.R

#' Reverse complement for a given DNA sequence
#'
#' \code{reverse_complement} Reverse complement of a DNA sequence
#'
#' @usage reverse_complement (sequence)
#'
#' @param sequence A DNA sequence
#' @export
#'

reverse_complement <- function(sequence) {
    revFile = system.file("python", "rev.py", package = "rpytrial")
    print (revFile)
    python.load(revFile)
    rev_strand = python.call ("revcompl", sequence)
    return (rev_strand)
}

在执行install_github之后,当我运行reverse_complement(&#34; AAAAA&#34;)时,我收到以下错误:

 [1] ""
   File "<string>", line 3
     except Exception as e:_r_error = e.__str__()
          ^
 IndentationError: expected an indented block
 Error in python.exec(python.command) : name 'revcompl' is not defined
 In addition: Warning message:
 In file(con, "r") :
   file("") only supports open = "w+" and open = "w+b": using the former

从错误中我可以说它没有找到路径。但有没有办法解决它?

谢谢, 萨蒂亚

1 个答案:

答案 0 :(得分:1)

tl; dr 将您的python目录移至inst/python

为了在system.file()找到的软件包中安装其他文件,您必须将它们放在其中一个inst目录中,中。 写入R扩展文档强制要求的特定目录。

来自撰写R扩展程序的Non-R scripts in packages

  

子目录exec可用于解释程序的脚本,如shell,BUGS,JavaScript,Matlab,Perl,php(amap),Python或Tcl(Simile),甚至是R.但是,似乎更多通常使用inst目录,例如WriteXLS/inst/PerlNMF/inst/m-filesRnavGraph/inst/tclRProtoBuf/inst/pythonemdbook/inst/BUGS以及gridSVG/inst/js

另请参阅Package subdirectories部分。

因此,如果您希望通过system.file("python", "rev.py", package = "rpytrial")找到您的python代码,那么必须位于inst/python/rev.py。我认为将它放在exec/rev.py中并使用system.file("exec", "rev.py", package = "rpytrial")也是一种选择(尽管我从未尝试过这种方法)。

如果您对在开发过程中直接在包的'head'目录中拥有python/目录有强烈的感觉,那么您可以编写一个自定义构建脚本(1)复制整个包目录; (2)将python移至inst/python; (3)从复制的目录中构建软件包(我无法通过devtools::install_github()看到如何使这项工作。)