来自包 rPithon 的 运行 一个 Python 代码中的错误
Error in running a Python code from R with the package rPithon
我想 运行 来自 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 版本。
我没有使用过 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
您收到的错误原因已由
"is not JSON serializable" 行。您的 R 代码调用 mpd
具有某些参数的函数,并且该函数本身将
正确执行。然后 rPithon 库将尝试发送
return 函数返回 R 的值,为此它将尝试
创建一个 JSON 对象
描述 return 值。
这适用于整数、浮点值、数组等,
但不是每一种 Python 对象都可以转换成这样的
JSON 代表。并且因为 rPithon 无法转换 return 值
mpd
这种方式,会产生一个错误。
您仍然可以使用 rPithon 调用 mpd
函数。下列
代码创建一个新的 Python 函数,该函数执行两个步骤:首先
它使用指定的参数调用 mpd
函数,然后它
将结果导出到一个文件,文件名也是一个参数。
使用 rPithon,然后从 R 调用新函数。因为 myFunction
没有 return 任何东西,以 JSON 格式表示 return 值不会有问题。
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
功能已知。
我想 运行 来自 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 版本。
我没有使用过 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
您收到的错误原因已由
"is not JSON serializable" 行。您的 R 代码调用 mpd
具有某些参数的函数,并且该函数本身将
正确执行。然后 rPithon 库将尝试发送
return 函数返回 R 的值,为此它将尝试
创建一个 JSON 对象
描述 return 值。
这适用于整数、浮点值、数组等,
但不是每一种 Python 对象都可以转换成这样的
JSON 代表。并且因为 rPithon 无法转换 return 值
mpd
这种方式,会产生一个错误。
您仍然可以使用 rPithon 调用 mpd
函数。下列
代码创建一个新的 Python 函数,该函数执行两个步骤:首先
它使用指定的参数调用 mpd
函数,然后它
将结果导出到一个文件,文件名也是一个参数。
使用 rPithon,然后从 R 调用新函数。因为 myFunction
没有 return 任何东西,以 JSON 格式表示 return 值不会有问题。
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
功能已知。