使用软件包rPithon从R运行Python代码时出错

时间:2016-11-18 00:13:22

标签: r rpython

我想从R:

运行这个Python代码
>>> import nlmpy 
>>> nlm = nlmpy.mpd(nRow=50, nCol=50, h=0.75) 
>>> nlmpy.exportASCIIGrid("raster.asc", nlm)

Nlmpy是一个用于构建中性景观模型的Python包。该示例来自website

要从R运行此Python代码,我正在尝试使用包rPithon。但是,我收到此错误消息:

if (pithon.available()) 
{ 
  nRow <- 50 
  nCol <- 50 
  h <- 0.75 

  # this file contains the definition of function concat 
  pithon.load("C:/Users/Anaconda2/Lib/site-packages/nlmpy/nlmpy.py") 
  pithon.call( "mpd", nRow, nCol, h) 

} else { 
  print("Unable to execute python") 
} 

Error in pithon.get("_r_call_return", instance.name = instname) : 
Couldn't retrieve variable: Traceback (most recent call last): 
File "C:/Users/Documents/R/win-library/3.3/rPithon/pythonwrapperscript.py", line 110, in <module> 
reallyReallyLongAndUnnecessaryPrefix.data = json.dumps([eval(reallyReallyLongAndUnnecessaryPrefix.argData)]) 
File "C:\Users\ANACON~1\lib\json\__init__.py", line 244, in dumps 
return _default_encoder.encode(obj) 
File "C:\Users\ANACON~1\lib\json\encoder.py", line 207, in encode 
chunks = self.iterencode(o, _one_shot=True) 
File "C:\Users\ANACON~1\lib\json\encoder.py", line 270, in iterencode 
return _iterencode(o, 0) 
File "C:\Users\ANACON~1\lib\json\encoder.py", line 184, in default 
raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: array([[ 0.36534654,  0.31962481,  0.44229946, ...,  0.11513079, 
0.07156331,  0.00286971], [ 0.41534291,  0.41333479,  0.48118995, ...,  0.19203674, 
0.04192771,  0.03679473], [ 0.5188

我的代码中的语法问题是否导致此错误?我使用适用于Windows的Anaconda 4.2.0平台,该平台使用的是Python 2.7版本。

2 个答案:

答案 0 :(得分:2)

我还没有使用nlmpy包,因此我不确定您的预期输出是多少。但是,此代码在R和Python之间成功通信。

有两个文件,

nlmpyInR.R

command ="python"
path2script="path_to_your_pythoncode/nlmpyInPython.py"

nRow <-50 
nCol <-50 
h <- 0.75

# Build up args in a vector
args = c(nRow, nCol, h)

# Add path to script as first arg
allArgs = c(path2script, args)

Routput = system2(command, args=allArgs, stdout=TRUE)
#The command would be python nlmpyInPython.py 50 50 0.75

print(paste("The Output is:\n", Routput))

nlmpyInPython.py

import sys
import nlmpy 
#Getting the arguments from the command line call
nRow = sys.argv[1]
nCol = sys.argv[2]
h = sys.argv[3]

nlm = nlmpy.mpd(nRow, nCol, h) 
pyhtonOutput = nlmpy.exportASCIIGrid("raster.asc", nlm)
#Whatever you print will get stored in the R's output variable. 
print pyhtonOutput

答案 1 :(得分:0)

你所得到的错误的原因是由暗示的 &#34;不是JSON可序列化的#34;线。你的R代码调用mpd 具有某些参数的函数,该函数本身会 正确执行。然后rPithon库将尝试发送 函数的返回值返回R,为此,它会尝试 创建JSON对象 它描述了返回值。

这适用于整数,浮点值,数组等, 但并不是每种Python对象都可以转换为这样的 JSON表示。并且因为rPithon无法转换返回值 这样mpd,就会产生错误。

您仍然可以使用rPithon来调用mpd函数。下列 代码创建一个新的Python函数,执行两个步骤:首先 它使用指定的参数调用mpd函数,然后调用它 将结果导出到文件,其文件名也是参数。 使用rPithon,然后从R调用新函数。因为myFunction没有返回任何内容,以JSON格式表示返回值不会有问题。

library("rPithon")

pythonCode = paste("import nlmpy.nlmpy as nlmpy",
                   "",
                   "def myFunction(nRow, nCol, h, fileName):",
                   "    nlm = nlmpy.mpd(nRow, nCol, h)",
                   "    nlmpy.exportASCIIGrid(fileName, nlm)", 
                   sep = "\n")
pithon.exec(pythonCode)

nRow <- 50 
nCol <- 50 
h <- 0.75 

pithon.call("myFunction", nRow, nCol, h, "outputraster.asc")

这里,Python代码定义为R字符串,并使用执行 pithon.exec。您也可以将Python代码放在​​单独的文件中 并使用pithon.load处理代码,以便myFunction 功能已知。