## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE, comment = "#>") has_arrow <- requireNamespace("arrow", quietly = TRUE) && requireNamespace("tibble", quietly = TRUE) knitr::opts_chunk$set(eval = has_arrow) # arrow can be built without Parquet support. has_parquet <- has_arrow && arrow::arrow_with_parquet() ## ----echo = FALSE, eval = !has_arrow, comment = NA---------------------------- # message("The arrow package is not available; code output is not shown.") ## ----setup-------------------------------------------------------------------- library(decimal) ## ----------------------------------------------------------------------------- a <- arrow::Array$create( c("100.05", "99999999999999999999.99", "0.01") )$cast(arrow::decimal128(25, 2)) a ## ----------------------------------------------------------------------------- format(as.vector(a), digits = 22) ## ----------------------------------------------------------------------------- as_decimal(a) ## ----------------------------------------------------------------------------- whole <- arrow::Array$create(c("1", "2"))$cast(arrow::decimal128(9, 2)) as_decimal(whole) attr(as_decimal(whole), "scale") ## ----------------------------------------------------------------------------- as_decimal(a, scale = 4) ## ----------------------------------------------------------------------------- as_decimal(arrow::Array$create(c("1.50", NA, "2.25"))$cast(arrow::decimal128(9, 2))) ## ----------------------------------------------------------------------------- cs <- arrow::ChunkedArray$create( arrow::Array$create(c("1.25", "2.50"))$cast(arrow::decimal128(9, 2)), arrow::Array$create("3.75")$cast(arrow::decimal128(9, 2)) ) cs$num_chunks as_decimal(cs) ## ----------------------------------------------------------------------------- as_decimal(arrow::Array$create("9007199254740993")$cast(arrow::int64())) ## ----------------------------------------------------------------------------- x <- decimal::decimal(c("1.25", "2.50", "-3.75")) a <- arrow::as_arrow_array(x) a$type ## ----------------------------------------------------------------------------- as.vector(a) ## ----------------------------------------------------------------------------- arrow::as_arrow_array(x, type = arrow_decimal_type(20, 2))$type ## ----------------------------------------------------------------------------- arrow::as_arrow_array(x, type = arrow::decimal128(20, 2))$type ## ----error = TRUE------------------------------------------------------------- try({ arrow::as_arrow_array(x, type = arrow::decimal128(2, 2)) }) ## ----------------------------------------------------------------------------- tab <- arrow::arrow_table( id = 1:3, amount = decimal::decimal(c("100.05", "0.01", "12.30")) ) tab$schema$GetFieldByName("amount")$type$ToString() tibble::as_tibble(as.data.frame(tab)) ## ----eval = has_parquet------------------------------------------------------- path <- tempfile(fileext = ".parquet") arrow::write_parquet(tab, path) arrow::read_parquet(path)$amount t2 <- arrow::read_parquet(path, as_data_frame = FALSE) t2$schema$GetFieldByName("amount")$type$ToString() as_decimal(t2$amount) ## ----include = FALSE, eval = has_parquet-------------------------------------- unlink(path) ## ----------------------------------------------------------------------------- foreign <- arrow::arrow_table( id = 1:2, amount = arrow::Array$create( c("100.05", "99999999999999999999.99") )$cast(arrow::decimal128(25, 2)) ) tibble::as_tibble(arrow_as_data_frame(foreign)) ## ----------------------------------------------------------------------------- types <- vapply(foreign$schema$fields, function(f) f$type$ToString(), character(1)) names(foreign)[grepl("^decimal", types)] ## ----error = TRUE------------------------------------------------------------- try({ arrow::as_arrow_array(decimal::decimal(c("1.50", "NaN"))) }) ## ----------------------------------------------------------------------------- big <- decimal::decimal( c("12345678901234567890.12345678", "0.10000000000000000001"), scale = 20 ) arrow::infer_type(big) ## ----error = TRUE------------------------------------------------------------- try({ arrow::infer_type(decimal::decimal(strrep("9", 90))) }) ## ----------------------------------------------------------------------------- as_decimal(arrow::as_arrow_array(big)) ## ----------------------------------------------------------------------------- tens <- decimal::decimal(c("12300", "4500"), scale = -2) arrow::infer_type(as_decimal(tens, scale = 0))