Python R 中的代码集成:在开发时有效但在发布后无效

Python code integration in R: works while development but not after release

我正在 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

$猫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

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

谢谢, 萨蒂亚

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

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

来自Writing R ExtensionsNon-R scripts in packages

Subdirectory exec could be used for scripts for interpreters such as the shell, BUGS, JavaScript, Matlab, Perl, php (amap), Python or Tcl (Simile), or even R. However, it seems more common to use the inst directory, for example WriteXLS/inst/Perl, NMF/inst/m-files, RnavGraph/inst/tcl, RProtoBuf/inst/python and emdbook/inst/BUGS and 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") 也是一种选择(尽管我从未尝试过这种方法)。

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