【问题标题】:Run R script from Python从 Python 运行 R 脚本
【发布时间】:2013-05-03 00:49:50
【问题描述】:

我想从 Python 脚本运行 R 脚本。在不同的坐标系中投影经纬度坐标需要 R 脚本。我已经考虑了两种选择来做到这一点。在第一个选项中,我喜欢将 lat 和 lon 坐标解析为如下所示的 R 脚本。然后最后我希望 R 脚本将 x 和 y 返回给 python 脚本,但我不知道该怎么做。

project<-function(lat,lon){

library(sp)
library(rgdal)

xy <- cbind(x = lon, y = lat)
S <- SpatialPoints(xy)
proj4string(S) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
Snew <- spTransform(S, CRS("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs"))
x <- coordinates(Snew)[1]
y <- coordinates(Snew)[2]

return(x,y)
}

对于我的第二个选项,我考虑使用底部的 R 脚本,其中已经包含 lat 和 lon。我尝试使用 subprocess.Popen('Rscript project.r', shell=True).wait() 从 python 运行它,但这似乎不起作用。它不会写入 xy.txt 文件。但是,如果我从 cmd 行运行它,则 R 脚本可以完成这项工作。谁能帮我解决这两个选项之一?

library(sp)
library(rgdal)

lat <- 52.29999924
lon <- 4.76999998

xy <- cbind(x = lon, y = lat)
S <- SpatialPoints(xy)
proj4string(S) <- CRS("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
Snew <- spTransform(S, CRS("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs"))
x <- coordinates(Snew)[1]
y <- coordinates(Snew)[2]

cat(x, file="xy.txt",sep="")
cat(y,file="xy.txt",append=TRUE)

【问题讨论】:

  • 出于好奇,您是否有理由不使用 Python GDAL 绑定? (pypi.python.org/pypi/GDAL) 好像会容易很多。
  • 如果它更容易,那么我肯定想尝试一下。但是,我不熟悉在 python 中使用 gdal。是否有示例代码说明如何使用 gdal 并将坐标从一个坐标系投影到另一个坐标系?
  • 我认为它与 R 绑定没有太大区别。如果只需要变换坐标,只需要proj4绑定即可;就这么简单:import pyproj; p1 = pyproj.Proj("+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"); p2 = pyproj.Proj("+proj=sterea +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000 +y_0=463000 +ellps=bessel +units=m +no_defs"); pyproj.transform(p1, p2, 52.3, 4.77) 纬度/经度参数可以是列表、元组、numpy 数组或标量。见pyproj.googlecode.com/svn/trunk/docs/index.html

标签: python r parsing cmd subprocess


【解决方案1】:

在我看来你快到了,一些评论:

  • x &lt;- coordinates(Snew)[1] 选择第一项,使用x &lt;- coordinates(Snew)[,1] 获取整个向量。这假设您传递latlon 的向量,而不是单个值。这里没有理由不允许传递lat lon 的向量。

  • return(x,y) 无效,R 不支持返回多个对象。相反,只需return(cbind(x,y))

  • 在函数内部我会使用require

关于从 Python 运行代码,我想看看 Rpy。这允许您从 Python 中调用 R 代码。 Rpy 为您来回传递 R 对象做了很多艰苦的工作,所以在这种情况下这是一个不错的选择。

我在 Rpy 中采用的方法是将 project 放入 .R 文件中,source 那个文件,然后调用 project

【讨论】:

  • library 也不会重新加载已加载的包。
【解决方案2】:

对于您的第一个解决方案 - 让 R 将坐标输出到控制台(使用 print 或 cat 或 R 中的任何内容),然后在 Python 中捕获它(参见此处:Running shell command from Python and capturing the output

这将为您提供一个包含 lat/lon 坐标的字符串,您只需使用适当的 Python 函数将它们解析出来。

【讨论】:

  • 无需手动解析 R 函数的输出,Rpy 可以为您轻松得多。
  • 大家好,我要感谢大家提供的非常好的答案。我认为 Rpy 可以为我完成这项工作,但是,Rpy 似乎不适用于 python 版本 2.5.4 和 R 版本 2.14.2?
猜你喜欢
  • 2013-11-22
  • 2016-12-15
  • 1970-01-01
  • 2015-11-24
  • 2018-09-30
  • 2018-09-22
  • 2014-03-03
  • 2013-10-24
  • 2011-02-04
相关资源
最近更新 更多