11

我想用类似的东西将一大块Python代码传递给R中的Python system('python ...'),我想知道在这种情况下是否有一种简单的方法来模拟python控制台。例如,假设代码是"print 'hello world'",我怎样才能在 R 中得到这样的输出?

>>> print 'hello world'
hello world

这仅显示输出:

> system("python -c 'print \"hello world\"'")
hello world

谢谢!

顺便说一句,我在r-help中询问但尚未得到回复(如果有,我会在此处发布答案)。

4

3 回答 3

11

你的意思是这样的吗?

export NUM=10
R -q -e "rnorm($NUM)"

您可能还想查看littler- http://dirk.eddelbuettel.com/code/littler.html

更新

根据您在下面的评论,我想我开始更好地理解您的问题。您正在询问有关在 R shell 中运行 python 的问题。

所以这里有一个例子: -

# code in a file named myfirstpythonfile.py

a = 1 
b = 19
c = 3 
mylist = [a, b, c]
for item in mylist:
    print item

因此,在您的 R shell 中,执行以下操作:

> system('python myfirstpythonfile.py')
1
19
3

本质上,您可以简单地调用python /path/to/your/python/file.py来执行一段 python 代码。

就我而言,我可以简单地调用python myfirstpythonfile.py假设我在我的 python 文件所在的同一目录(路径)中启动了我的 R shell。

进一步更新

如果你真的想打印出源代码,这里有一种可能的蛮力方法。在您的 R 外壳中:-

> system('python -c "import sys; sys.stdout.write(file(\'myfirstpythonfile.py\', \'r\').read());"; python myfirstpythonfile.py')
a = 1
b = 19
c = 3
mylist = [a, b, c]
for item in mylist:
    print item
1
19
3

并进一步更新:-)

因此,如果目的是在执行代码之前打印 python 代码,我们可以使用 python 跟踪模块(参考:http ://docs.python.org/library/trace.html )。在命令行中,我们使用该-m选项来调用一个 python 模块,并为它后面的那个 python 模块指定选项。

因此,对于我上面的示例,它将是:-

$ python -m trace --trace myfirstpythonfile.py
 --- modulename: myfirstpythonfile, funcname: <module>
myfirstpythonfile.py(1): a = 1
myfirstpythonfile.py(2): b = 19
myfirstpythonfile.py(3): c = 3
myfirstpythonfile.py(4): mylist = [a, b, c]
myfirstpythonfile.py(5): for item in mylist:
myfirstpythonfile.py(6):     print item
1
myfirstpythonfile.py(5): for item in mylist:
myfirstpythonfile.py(6):     print item
19
myfirstpythonfile.py(5): for item in mylist:
myfirstpythonfile.py(6):     print item
3
myfirstpythonfile.py(5): for item in mylist:
 --- modulename: trace, funcname: _unsettrace
trace.py(80):         sys.settrace(None)

正如我们所看到的,它跟踪 python 代码的确切行,立即执行结果并将其输出到 stdout。

于 2012-04-14T17:30:58.557 回答
2

系统命令有一个名为intern = FALSE. 使这个TRUE和之前可见的任何输出都将存储在一个变量中。

现在使用此选项运行您的系统命令,您应该直接在变量中获取输出。像这样

tmp <- system("python -c 'print \"hello world\"'",intern=T)
于 2013-08-08T14:14:55.280 回答
0

我解决这个问题的方法是定义我自己的函数,这些函数粘贴参数,写出一个临时的 .py 文件,然后它们通过系统调用执行 python 文件。下面是一个调用 ArcGIS 的欧几里得距离函数的示例:

py.EucDistance = function(poly_path,poly_name,snap_raster,out_raster_path_name,maximum_distance,mask){

    py_path = 'G:/Faculty/Mann/EucDistance_temp.py'
    poly_path_name = paste(poly_path,poly_name, sep='')

    fileConn<-file(paste(py_path))
    writeLines(c(
        paste('import arcpy'),
        paste('from arcpy import env'),
        paste('from arcpy.sa import *'),
        paste('arcpy.CheckOutExtension("spatial")'),

        paste('out_raster_path_name = "',out_raster_path_name,'"',sep=""),
        paste('snap_raster = "',snap_raster,'"',sep=""),
        paste('cellsize =arcpy.GetRasterProperties_management(snap_raster,"CELLSIZEX")'),
        paste('mask = "',mask,'"',sep=""),
        paste('maximum_distance = "',maximum_distance,'"',sep=""),
        paste('sr = arcpy.Describe(snap_raster).spatialReference'),

        paste('arcpy.env.overwriteOutput = True'),
        paste('arcpy.env.snapRaster = "',snap_raster,'"',sep=""),
        paste('arcpy.env.mask = mask'),
        paste('arcpy.env.scratchWorkspace ="G:/Faculty/Mann/Historic_BCM/Aggregated1080/Scratch.gdb"'),
        paste('arcpy.env.outputCoordinateSystem = sr'),


        # get spatial reference for raster and force output to that
        paste('sr = arcpy.Describe(snap_raster).spatialReference'),
        paste('py_projection = sr.exportToString()'),     
        paste('arcpy.env.extent = snap_raster'),
        paste('poly_name = "',poly_name,'"',sep=""),
        paste('poly_path_name = "',poly_path_name,'"',sep=""),

        paste('holder = EucDistance(poly_path_name, maximum_distance, cellsize, "")'),
        paste('holder = SetNull(holder < -9999, holder)'),
        paste('holder.save(out_raster_path_name) ')

    ), fileConn, sep = "\n")
    close(fileConn)

    system(paste('C:\\Python27\\ArcGIS10.1\\python.exe', py_path))
}
于 2015-05-02T13:23:02.120 回答