3.7 导出数据

3.7.1 导出运行结果

capture.output(..., file = NULL, append = FALSE,
               type = c("output", "message"), split = FALSE)

capture.output 将一段R代码执行结果,保存到文件,参数为表达式。capture.outputsink 的关系相当于 withattach 的关系。

glmout <- capture.output(summary(glm(case ~ spontaneous + induced,
  data = infert, family = binomial()
)), file = "data/capture.txt")
capture.output(1 + 1, 2 + 2)
## [1] "[1] 2" "[1] 4"
capture.output({
  1 + 1
  2 + 2
})
## [1] "[1] 4"

sink 函数将控制台输出结果保存到文件,只将 outer 函数运行的结果保存到 ex-sink.txt 文件,outer 函数计算的是直积,在这里相当于 seq(10) %*% t(seq(10)),而在 R 语言中,更加有效的计算方式是 tcrossprod(seq(10),seq(10))

sink("data/ex-sink.txt")
i <- 1:10
outer(i, i, "*") 
##       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
##  [1,]    1    2    3    4    5    6    7    8    9    10
##  [2,]    2    4    6    8   10   12   14   16   18    20
##  [3,]    3    6    9   12   15   18   21   24   27    30
##  [4,]    4    8   12   16   20   24   28   32   36    40
##  [5,]    5   10   15   20   25   30   35   40   45    50
##  [6,]    6   12   18   24   30   36   42   48   54    60
##  [7,]    7   14   21   28   35   42   49   56   63    70
##  [8,]    8   16   24   32   40   48   56   64   72    80
##  [9,]    9   18   27   36   45   54   63   72   81    90
## [10,]   10   20   30   40   50   60   70   80   90   100
sink()

3.7.2 导出数据对象

load(file, envir = parent.frame(), verbose = FALSE)

save(..., list = character(),
     file = stop("'file' must be specified"),
     ascii = FALSE, version = NULL, envir = parent.frame(),
     compress = isTRUE(!ascii), compression_level,
     eval.promises = TRUE, precheck = TRUE)

save.image(file = ".RData", version = NULL, ascii = FALSE,
           compress = !ascii, safe = TRUE)

loadsave 函数加载或保存包含工作环境信息的数据对象,save.image 保存当前工作环境到磁盘,即保存工作空间中所有数据对象,数据格式为 .RData,即相当于

save(list = ls(all.names = TRUE), file = ".RData", envir = .GlobalEnv)

dump 保存数据对象 AirPassengers 到文件 AirPassengers.txt,文件内容是 R 命令,可把AirPassengers.txt看作代码文档执行,dput 保存数据对象内容到文件AirPassengers.dat,文件中不包含变量名 AirPassengers。注意到 dump 输入是一个字符串,而 dput 要求输入数据对象的名称,source 函数与 dump 对应,而 dgetdput对应。

# 加载数据
data(AirPassengers, package = "datasets")
# 将数据以R代码块的形式保存到文件
dump('AirPassengers', file = 'data/AirPassengers.txt') 
# source(file = 'data/AirPassengers.txt')

接下来,我们读取 AirPassengers.txt 的文件内容,可见它是一段完整的 R 代码,可以直接复制到 R 的控制台中运行,并且得到一个与原始 AirPassengers 变量一样的结果

cat(readLines('data/AirPassengers.txt'), sep = "\n")
## AirPassengers <-
## structure(c(112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 
## 104, 118, 115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 
## 140, 145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166, 
## 171, 180, 193, 181, 183, 218, 230, 242, 209, 191, 172, 194, 196, 
## 196, 236, 235, 229, 243, 264, 272, 237, 211, 180, 201, 204, 188, 
## 235, 227, 234, 264, 302, 293, 259, 229, 203, 229, 242, 233, 267, 
## 269, 270, 315, 364, 347, 312, 274, 237, 278, 284, 277, 317, 313, 
## 318, 374, 413, 405, 355, 306, 271, 306, 315, 301, 356, 348, 355, 
## 422, 465, 467, 404, 347, 305, 336, 340, 318, 362, 348, 363, 435, 
## 491, 505, 404, 359, 310, 337, 360, 342, 406, 396, 420, 472, 548, 
## 559, 463, 407, 362, 405, 417, 391, 419, 461, 472, 535, 622, 606, 
## 508, 461, 390, 432), tsp = c(1949, 1960.9166666666699, 12), class = "ts")

dput 函数类似 dump 函数,保存数据对象到磁盘文件

# 将 R 对象保存/导出到磁盘
dput(AirPassengers, file = 'data/AirPassengers.dat')
AirPassengers
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 271 306
1957 315 301 356 348 355 422 465 467 404 347 305 336
1958 340 318 362 348 363 435 491 505 404 359 310 337
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432
# dget 作用与 dput 相反
AirPassengers2 <- dget(file = 'data/AirPassengers.dat')
AirPassengers2
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1949 112 118 132 129 121 135 148 148 136 119 104 118
1950 115 126 141 135 125 149 170 170 158 133 114 140
1951 145 150 178 163 172 178 199 199 184 162 146 166
1952 171 180 193 181 183 218 230 242 209 191 172 194
1953 196 196 236 235 229 243 264 272 237 211 180 201
1954 204 188 235 227 234 264 302 293 259 229 203 229
1955 242 233 267 269 270 315 364 347 312 274 237 278
1956 284 277 317 313 318 374 413 405 355 306 271 306
1957 315 301 356 348 355 422 465 467 404 347 305 336
1958 340 318 362 348 363 435 491 505 404 359 310 337
1959 360 342 406 396 420 472 548 559 463 407 362 405
1960 417 391 419 461 472 535 622 606 508 461 390 432

同样地,现在我们观察 dput 函数保存的文件 AirPassengers.dat 内容,和dump 函数保存的文件 AirPassengers.txt相比,就缺一个赋值变量

cat(readLines('data/AirPassengers.dat'), sep = "\n")
structure(c(112, 118, 132, 129, 121, 135, 148, 148, 136, 119, 
104, 118, 115, 126, 141, 135, 125, 149, 170, 170, 158, 133, 114, 
140, 145, 150, 178, 163, 172, 178, 199, 199, 184, 162, 146, 166, 
171, 180, 193, 181, 183, 218, 230, 242, 209, 191, 172, 194, 196, 
196, 236, 235, 229, 243, 264, 272, 237, 211, 180, 201, 204, 188, 
235, 227, 234, 264, 302, 293, 259, 229, 203, 229, 242, 233, 267, 
269, 270, 315, 364, 347, 312, 274, 237, 278, 284, 277, 317, 313, 
318, 374, 413, 405, 355, 306, 271, 306, 315, 301, 356, 348, 355, 
422, 465, 467, 404, 347, 305, 336, 340, 318, 362, 348, 363, 435, 
491, 505, 404, 359, 310, 337, 360, 342, 406, 396, 420, 472, 548, 
559, 463, 407, 362, 405, 417, 391, 419, 461, 472, 535, 622, 606, 
508, 461, 390, 432), tsp = c(1949, 1960.91666666667, 12), class = "ts")

openxlsx 可以读写 XLSX 文档

美团使用的大数据工具有很多,最常用的 Hive、Spark、Kylin、Impala、Presto 等,详见 https://tech.meituan.com/2018/08/02/mt-r-practice.html。下面主要介绍如何在 R 中连接 MySQL、Presto 和 Spark。

sparklyr.flint 支持 Spark 的时间序列库 flintsparkxgb 为 Spark 上的 XGBoost 提供 R 接口,sparkwarc 支持加载 Web ARChive 文件到 Spark 里 sparkavro 支持从 Apache Avro (https://avro.apache.org/) 读取文件到 Spark 里,sparkbq 是一个 sparkly 扩展包,集成 Google BigQuery 服务,geospark 提供 GeoSpark 库的 R 接口,并且以 sf 的数据操作方式,rsparkling H2O Sparkling Water 机器学习库的 R 接口。

Spark 性能优化,参考三篇博文

其他材料