-
Notifications
You must be signed in to change notification settings - Fork 147
/
s3read_using.R
66 lines (63 loc) · 2.38 KB
/
s3read_using.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#' @rdname s3read_using
#' @title Custom read and write
#' @description Read/write objects from/to S3 using a custom function
#' @param x For \code{s3write_using}, a single R object to be saved via the first argument to \code{FUN} and uploaded to S3.
#' @param FUN For \code{s3write_using}, a function to which \code{x} and a file path will be passed (in that order).
#' @param ... Additional arguments to \code{FUN}
#' @template object
#' @template bucket
#' @param opts Optional additional arguments passed to \code{\link{put_object}} or \code{\link{save_object}}, respectively.
#' @return For \code{s3write_using}, a logical, invisibly. For \code{s3read_using}, the output of \code{FUN} applied to the file from \code{object}.
#' @examples
#' \dontrun{
#' library("datasets")
#' # create bucket
#' b <- put_bucket("myexamplebucket")
#'
#' # save a dataset to the bucket as a csv
#' if (require("utils")) {
#' s3write_using(mtcars, FUN = write.csv, object = "mtcars.csv", bucket = b)
#' }
#'
#' # load dataset from the bucket as a csv
#' if (require("utils")) {
#' s3read_using(FUN = read.csv, object = "mtcars.csv", bucket = b)
#' }
#'
#' # cleanup
#' delete_object(object = "mtcars.csv", bucket = b)
#' delete_bucket(bucket = b)
#' }
#' @seealso \code{\link{s3saveRDS}}, \code{\link{s3readRDS}}, \code{\link{put_object}},\code{\link{get_object}}
#' @importFrom tools file_ext
#' @export
s3write_using <- function(x, FUN, ..., object, bucket, opts = NULL) {
tmp <- tempfile()
on.exit(unlink(tmp))
value <- FUN(x, tmp, ...)
if (missing(bucket)) {
bucket <- get_bucketname(object)
}
object <- get_objectkey(object)
if (is.null(opts)) {
r <- put_object(file = tmp, bucket = bucket, object = object)
} else {
r <- do.call("put_object", c(list(file = rawConnectionValue(tmp), bucket = bucket, object = object), opts))
}
return(invisible(r))
}
#' @rdname s3read_using
#' @export
s3read_using <- function(FUN, ..., object, bucket, opts = NULL) {
if (missing(bucket)) {
bucket <- get_bucketname(object)
}
object <- get_objectkey(object)
tmp <- tempfile(fileext = paste0(".", tools::file_ext(object)))
if (is.null(opts)) {
r <- save_object(bucket = bucket, object = object, file = tmp)
} else {
r <- do.call("save_object", c(list(bucket = bucket, object = object, file = tmp), opts))
}
return(FUN(tmp, ...))
}