我想从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版本。
答案 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
功能已知。