RCaller教程:在FME中R的输入和输出

RCaller教程:在FME中R的输入和输出

介绍

如果你需要执行比StatisticsCalculator更高级的统计功能,则可以使用转换器Rcaller实现更高级的统计分析。Rcaller让你能够在FME中执行R script。

下载

5914-rcallerlinearregression.fmwt

5910-rcallerlinearregressionwithgroups.fmwt

入门

    在使用RCaller之前,你需要安装合适的R软件包。请参阅FME用户文档中有关安装R解释器的章节。

在开始使用RCaller之前,记住两件事:

  1. R不喜欢UNC路径名,因此,不能运行存储在UNC路径上的FME工作空间。即:\\myprojects\fmeWorkspaces.你必须在映射的驱动器上运行FME工作空间,即:f:\myprojects\fmeWorkspaces.
  2. 如果你不熟悉这些概念,请阅读R的一些内容。这里提供一个教程

源数据

将转换器或要素类连接到RCaller的输入端口时,FME会向RCaller添加新的端口。这个新的输入端口会继承源对象的名称(即变量名或要素类名)。

端口名称用作R中的data frame的名称,因此可以将端口名称命名为你可以在R脚本中使用的名称。

FME将数据加载到临时的SQLite数据库,因此,为了提高性能和可读性,只需选择要在R脚本中使用的属性。确保数据类型正确。

FME将放入R的数据看作data frame。可以通过拖动“Data Frames”里列出的data frame来访问数据:

比如,要访问向量Estimated,只需要将Estimated拖动到脚本窗口中,你就会看到Date$Estimated.

创建R脚本

这不是R教程。如果你是R新手,我建议你使用R Console来开发和调试R脚本——你可以更容易的看到中间结果,也能得到更好的反馈。然后将脚本复制粘贴到RCaller中。在R Console中可以清楚发现问题所在,同时,可以使用R提供的模块加载数据样本。即:

注意:R使用UNIX路径,即’/’而不是’\’。

输出R结果

可能会很棘手!RCaller通过一个名为“fmeOutput”的data frame将数据传回给FME,data frame的每一行都将成为FME中的一个单独的要素输出。如果你知道如何构建和添加data frame,你可以跳过本章节。

要填充fmeOutput的data frame,你可以简单地传回一列值(向量长度为1)。即:

这会产生一个FME要素,该要素包含两个平均值,其属性名为meanX和meanY。但是,大部分情况下,R函数返回的结果更复杂些。比如,解决y=mx+k这种问题的线性回归函数:

使用R函数summary()查看结果:

如何让结果返回FME?

函数names()会返回summary里面的变量名:

但是,其中的一些属性本身就是更复杂的对象,比如coefficients:

如何将结果返回给FME,比如y=mx+k分析结果里的r方,m和k?

你必须将你需要的值挑选出来并传递给fmeOutput. 在上面的例子中,m由Data$Estimate的Estimate = -0.009291111给出,k(y截距)由(Intercept)的Estimate = 12.051001492给出,r方直接由r.squared给出。所以,可以如此设置:

非常简单!

工作空间5976-rcallerlinearregression.fmwt说明了上述示例。

最后一个提示:在RCaller中暴露结果变量,使工作空间的工作更轻松:

R结果导出到临时文件

在某些情况下,可能不适合为R结果使用data frame。比如对于大型栅格或影像数据。在这种情况下,你可以将你的R结果导出到临时数据文件,并让FME重新读取这些结果。

循环分组

对于某个统计问题,比如你有一个定性属性Code,其值为ABC ABD和TXU。它与定量值有一定的关系,这样分组就变得有意义。

例如,你可能需要计算每个Code的平均值:

你可以将分析放入循环中,通过Code对数据进行采样,然后计算回归。过程如下:

但是你不能只使用

r2 <- summary(lm)$r.squared

返回结果,因为这样你只是返回了最近的r2,而不是计算出来的三个值。

一个可行的解决方法是,为每个结果构建向量,然后将这些结果向量复制给fmeOutput

你还可以将结果直接分配给一个效率更高的data frame。

工作空间5910-rcallerlinearregressionwithgroups.fmwt演示了上述示例。

调试R脚本

如果你对R比较陌生,那么我建议你现在R Console中开发脚本,然后再转移到RCaller。如果你遇到RCaller错误:

ERROR |RCaller(InlineQueryFactory): InlineQueryFactory failed with exit code 1 when executing R script. Output was: Loading required package: gsubfn Loading required package: proto Loading required package: RSQLite

如果脚本中存在语法错误或未定义的变量引用,这似乎是常见的错误响应,因此请仔细检查脚本中未分配的变量或拼写错误。

记住,和FME一样,R是区分大小写的。

猜你喜欢

转载自blog.csdn.net/fmechina/article/details/81743900