跳过内容

如果您有兴趣为 arrow 贡献代码,本文将高层次地解释我们的方法。在文章末尾,我们提供了扩展本文内容的链接。

包结构和约定

首先概述包的结构会有所帮助。

C++ 是一种面向对象的语言,因此 Arrow C++ 库的核心逻辑封装在类和方法中。在 arrow R 包中,这些类作为 R6 类实现,其中大部分从命名空间中导出。

为了匹配 C++ 命名约定,R6 类使用“大驼峰命名法”,例如 RecordBatch。这使得在 代码文档 中查找相关的 C++ 实现变得容易。为了简化 R 中的操作,C++ 库命名空间通常被省略或扁平化;也就是说,C++ 库中的 arrow::io::FileOutputStream 在 R 包中就是 FileOutputStream。一个例外是文件读取器,其中命名空间对于消除歧义是必要的。因此 arrow::csv::TableReader 变为 CsvTableReader,而 arrow::json::TableReader 变为 JsonTableReader

其中一些类不应该直接实例化;它们可能是基类或其他类型的助手。对于那些您应该能够创建的类,使用 $create() 方法来实例化一个对象。例如,rb <- RecordBatch$create(int = 1:10, dbl = as.numeric(1:10)) 将创建一个 RecordBatch。许多这些 R 用户最常遇到的工厂方法也带有一个“snake_case”别名,以便更熟悉当代的 R 用户。因此 record_batch(int = 1:10, dbl = as.numeric(1:10)) 将与上面的 RecordBatch$create() 产生相同的结果。

arrow R 包的典型用户可能永远不会直接处理 R6 对象。我们提供更多 R 友好的包装函数作为 C++ 库的高级接口。R 用户可以调用 read_parquet(),而无需知道或关心他们正在实例化一个 ParquetFileReader 对象并调用其 $ReadFile() 方法。这些类存在并可供高级程序员使用,他们希望对 C++ 库的使用方式进行精细控制。

实现功能的方法

我们实现功能的总体理念是匹配用户可能熟悉的现有 R 函数签名,同时公开 Arrow 提供的任何附加功能。目的是允许用户使用他们现有的代码,只需进行最少的更改,或者学习新的代码或方法。

我们通过以下几种方式实现这一点:

  • 在实现具有 R 等效项的函数时,尽可能支持 R 版本中可用的参数——使用原始参数名称并在函数内部转换为 arrow 参数名称。

  • 如果存在 R 函数中不存在的 arrow 参数,允许用户也传递这些选项。

  • 在必要时,为 R 中不存在但在 Arrow 中存在的功能向函数签名添加额外参数(例如,在读取 CSV 数据集时传入 schema)。