我正在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
从错误中我可以说它没有找到路径。但有没有办法解决它?
谢谢, 萨蒂亚
答案 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/Perl
,NMF/inst/m-files
,RnavGraph/inst/tcl
,RProtoBuf/inst/python
和emdbook/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()
看到如何使这项工作。)