Important

翻译是一项社区工作 you can join。此页面目前翻译进度为 100.00%。

17.33. 在处理(Processing)中使用 R 脚本

模块由Matteo Ghetta贡献,由 Scuola Superiore Sant'Anna 资助

通过 Processing R Provider 插件,Processing 可以在 QGIS 中编写并运行 R 脚本。

Warning

R 必须已安装在您的计算机上,并且 PATH 必须正确设置。此外,Processing 仅调用外部 R 包,无法自行安装它们。因此,请确保直接在 R 中安装所需的外部包。参见用户手册中的相关 章节

Note

如果您遇到 package 问题,可能是由于缺少 Processing 所需的*必备*包,例如 sprgdalraster

17.33.1. 添加脚本

添加脚本很简单。最简单的方法是打开 Processing 工具箱,从工具箱顶部的 R 菜单(标有 R 图标)中选择 Create new R script...。您也可以在例如文本编辑器中创建脚本,并将其保存到您的 R 脚本文件夹(processing/rscripts)中。保存后,右键单击 Processing 工具箱中的脚本名称,然后选择 Edit Script... 即可进行编辑。

../../../_images/r_intro_1.png

Note

如果在 Processing 中看不到 R,请在 Processing ► Options ► Providers 中激活它

它将打开一个*脚本编辑器窗口*,您必须先指定一些参数,然后才能添加脚本主体。

../../../_images/r_intro_2.png

17.33.2. 创建图表

在本教程中,我们将创建一个矢量图层字段的**箱线图(boxplot)**。

打开 exercise_data/processing/r_intro/ 文件夹下的 r_intro.qgs QGIS 工程。

脚本参数

打开编辑器并在其开头开始编写。

您**必须**在脚本主体**之前**指定一些参数:

  1. 您希望将脚本放入的组名称(本例中为 plots)(如果该组不存在,将自动创建)::

    ##plots=group
    

    您将在 Processing 工具箱的 plots R 组中找到您的脚本。

  2. 您需要告知 Processing 您希望显示一个图表(本例中)::

    ##showplots
    

    随后您将在 Result Viewer 面板中找到指向该图表的链接(可通过 View ► PanelsProcessing ► Results Viewer 开启或关闭该面板)。

  3. 您还需要告知 Processing 您的输入数据。在本例中,我们希望从矢量图层的一个字段创建图表::

    ##Layer=vector
    

    Processing 现在知道输入的是一个矢量。名称 Layer 并不重要,重要的是 vector 参数。

  4. 最后,您需要指定矢量图层的输入字段(使用上面提供的名称——Layer)::

    ##X=Field Layer
    

    Processing 现在知道您需要 Layer 的一个字段,并且您将它命名为 X

  5. 您也可以使用 name 来定义脚本的名称::

    ##My box plot script=name
    

    如果未定义,将使用文件名作为脚本名称。

脚本主体

现在您已经设置好了脚本的*头部*,可以添加函数了::

boxplot(Layer[[X]])

boxplot 是 R 函数的名称,参数 Layer 是您为输入数据集定义的名称,X 是您为该数据集字段定义的名称。

Warning

参数 X 必须用双层方括号([[]])括起来。

最终脚本如下所示::

##Vector processing=group
##showplots
##Layer=vector
##X=Field Layer
boxplot(Layer[[X]])
../../../_images/r_intro_3.png

将脚本保存在 Processing 建议的默认路径(processing/rscripts)中。如果您未在脚本头部定义 name,则您所选的文件名将成为 Processing 工具箱中的脚本名称。

Note

您可以将脚本保存在任意位置,但 Processing 将无法自动将其纳入处理工具箱,因此您必须手动上传。

现在只需点击编辑器窗口顶部的按钮即可运行它:

../../../_images/r_intro_4.png

关闭编辑器窗口后,使用 Processing 的文本框查找您的脚本:

../../../_images/r_intro_5.png

现在您可以在 Processing 算法窗口中填写所需的参数:

  • 对于 Layer,选择 sample_points

  • 对于 X 字段,选择 value

点击 Run

../../../_images/r_intro_6.png

Result window 应自动打开,如果没有,请点击 Processing ► Result Viewer...

点击查看器中的链接,您将看到:

../../../_images/r_intro_7.png

Note

您可以通过右键单击图表来打开、复制和保存图像。

17.33.3. 创建矢量

您还可以创建一个矢量图层并使其自动加载到 QGIS 中。

下面的示例取自 Random sampling grid (随机抽样网格)脚本,该脚本可以在R脚本的在线集合中找到(该在线集合中的脚本可以在https://github.com/qgis/QGIS-Processing/tree/master/rscripts中找到)。

本练习的目标是使用输入的矢量图层限制范围,通过 sp 包中的 spsample 函数创建一个随机点矢量图层。

脚本参数

与之前一样,我们需要在脚本主体之前设置一些参数:

  1. 指定您希望将脚本放入的组名,本例中为 Point pattern analysis::

    ##Point pattern analysis=group
    
  2. 定义一个输入参数(矢量图层),用于限制随机点的放置位置::

    ##Layer=vector
    
  3. 设置一个输入参数,用于指定将要创建的点数(Size,默认值为 10)::

    ##Size=number 10
    

    Note

    由于已定义默认值(10),用户可以更改该数值,也可以将该参数留空。

  4. 指定存在一个输出矢量图层(名为 Output)::

    ##Output=output vector
    

脚本主体

现在您可以添加函数主体:

  1. 使用 spsample 函数::

    pts=spsample(Layer, Size, type="random")
    

    该函数使用 Layer 限制点的放置位置(若为线图层,则点必须位于图层中的某条线上;若为面图层,则点必须位于某个多边形内部)。点的数量来自 Size 参数,采样方法为 random

  2. 生成输出(Output 参数)::

    Output=SpatialPointsDataFrame(pts, as.data.frame(pts))
    

最终脚本如下所示::

##Point pattern analysis=group
##Layer=vector
##Size=number 10
##Output=output vector
pts=spsample(Layer, Size, type="random")
Output=SpatialPointsDataFrame(pts, as.data.frame(pts))
../../../_images/r_intro_8.png

保存并点击运行按钮执行它。

在新窗口中输入正确的参数:

../../../_images/r_intro_9.png

然后点击 run。

结果图层将添加到图层面板中,其点将显示在地图画布上:

../../../_images/r_intro_10.png

17.33.4. R 的文本与图形输出——语法

Processing(通过 Processing R Provider 插件)使用特殊语法从 R 中获取结果:

  • 命令前的 >``(如 ``>lillie.test(Layer[[Field]]))表示结果应发送至 R 输出(结果查看器)

  • 图表后的 + 允许叠加绘图。例如 plot(Layer[[X]], Layer[[Y]]) + abline(h=mean(Layer[[X]]))