0

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

$猫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("AAAAA") 时,出现以下错误:

 [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

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

谢谢,萨蒂亚

4

1 回答 1

1

tl;博士将您的python目录移动到inst/python.

为了安装包并由 找到的其他文件system.file(),您必须将它们放在inst目录中,或者编写 R 扩展文档规定的其他特定目录之一中。

编写 R 扩展包中的非 R 脚本

子目录exec可用于解释器的脚本,例如 shell、BUGS、JavaScript、Matlab、Perl、php (amap)、Python 或 Tcl (Simile),甚至 R。但是,使用该inst目录似乎更常见,例如WriteXLS/inst/Perl, NMF/inst/m-files,和和。RnavGraph/inst/tcl_RProtoBuf/inst/pythonemdbook/inst/BUGSgridSVG/inst/js

另请参阅包子目录部分。

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

如果您在开发时对将目录直接放在包的“头”目录中有强烈的感觉python/,您可以编写一个自定义构建脚本,(1) 复制整个包目录;(2) 移动pythoninst/python; 和(3)从复制的目录构建包(虽然我看不到如何通过 来完成这项工作devtools::install_github())。

于 2016-05-17T19:29:20.980 回答