Write a file using `saveRDS()` so that it is backwards compatible with old versions of R
Expanding on my comment with a demo:
$ Rscript --version | head -1
R scripting front-end version 3.6.0 (2019-04-26)
$ Rscript -e 'saveRDS(1:10, file="foo.rds")'
$
$ docker run --rm -ti r-base:3.4.0 Rscript --version | head -1
R scripting front-end version 3.4.0 (2017-04-21)
$ docker run --rm -ti -v ${PWD}:/work -w /work r-base:3.4.0 Rscript -e 'print(readRDS("foo.rds"))'
Error in readRDS("foo.rds") :
cannot read workspace version 3 written by R 3.6.0; need R 3.5.0 or newer
Calls: print -> readRDS
Execution halted
$
$ Rscript -e 'saveRDS(1:10, file="foo.rds", version=2)'
$ docker run --rm -ti -v ${PWD}:/work -w /work r-base:3.4.0 Rscript -e 'print(readRDS("foo.rds"))'
[1] 1 2 3 4 5 6 7 8 9 10
$
I use my normal R version which I show to be 3.6.0, and I then launch R 3.4.0 via Rocker, also showing its version.
As expected, it first fails -- and once the data is resaved with version=2
it works as is should.
Why are data in my package serialized and not being read in the most-recent version of R?
The warning doesn't mean/isn't telling you that you can't load files saved in 4.0.0 in 4.0.2. Rather, it's warning you that others using R < 3.5.0 won't be able to load your saved files.
When you save your data, use
save(MyObject, file = "MyObject.RData", version = 2)
to maintain back-compatibility and avoid the warning.
From the R 3.x news file, under version 3.6.0:
Serialization format version 3 becomes the default for serialization and saving of the workspace (save(), serialize(), saveRDS(), compiler::cmpfile()). Serialized data in format 3 cannot be read by versions of R prior to version 3.5.0. Serialization format version 2 is still supported and can be selected by version = 2 in the save/serialization functions. The default can be changed back for the whole R session by setting environment variables R_DEFAULT_SAVE_VERSION and R_DEFAULT_SERIALIZE_VERSION to 2. For maximal back-compatibility, files ‘vignette.rds’ and ‘partial.rdb’ generated by R CMD build are in serialization format version 2, and resave by default produces files in serialization format version 2 (unless the original is already in format version 3).
How to source() .R file saved using UTF-8 encoding?
We talked about this a lot in the comments to my previous post but I don't want this to get lost on page 3 of comments: You have to set the locale, it works with both input from the R-console (see screenshot in comments) as well as with input from file see this screenshot:
The file "myfile.r" contains:
russian <- function() print ("Американские с...");
The console contains:
source("myfile.r", encoding="utf-8")
> Error in source(".....
Sys.setlocale("LC_CTYPE","ru")
> [1] "Russian_Russia.1251"
russian()
[1] "Американские с..."
Note that the file-in fails and it points to the same character as the original poster's error (the one after "R). I can not do this with Chinese because i would have to install "Microsoft Pinyin IME 3.0", but the process is the same, you just replace the locale with "chinese" (the naming is a bit inconsistent, consult the documentation).
Export all user inputs in a Shiny app to file and load them later
If you look at the code of the shiny input update functions, they end by session$sendInputMessage(inputId, message)
. message
is a list of attributes that need to be changed in the input, for ex, for a checkbox input: message <- dropNulls(list(label = label, value = value))
Since most of the input have the value
attribute, you can just use the session$sendInputMessage
function directly on all of them without the try
.
Here's an example, I created dummy_data
to update all the inputs when you click on the button, the structure should be similar to what you export:
ui.R
library(shiny)
shinyUI(fluidPage(
textInput("control_label",
"This controls some of the labels:",
"LABEL TEXT"),
numericInput("inNumber", "Number input:",
min = 1, max = 20, value = 5, step = 0.5),
radioButtons("inRadio", "Radio buttons:",
c("label 1" = "option1",
"label 2" = "option2",
"label 3" = "option3")),
actionButton("update_data", "Update")
))
server.R
library(shiny)
dummy_data <- c("inRadio=option2","inNumber=10","control_label=Updated TEXT" )
shinyServer(function(input, output,session) {
observeEvent(input$update_data,{
out <- lapply(dummy_data, function(l) unlist(strsplit(l, "=")))
for (inpt in out) {
session$sendInputMessage(inpt[1], list(value=inpt[2]))
}
})
})
All the update
functions also preformat the value before calling session$sendInputMessage
. I haven't tried all possible inputs but at least for these 3 you can pass a string to the function to change the numericInput
and it still works fine.
If this is an issue for some of your inputs, you might want to save reactiveValuesToList(input)
using save
, and when you want to update your inputs, use load
and run the list in the for
loop (you'll have to adapt it to a named list).
Strange output from fread when called from knitr
It's a % progress counter. For me it prints 0%, 5%, 10%, ... 95%, 100% (for example) with a \r
at the end to make it appear on one line just underneath the call to fread
when typed at the prompt.
But when called from functions, batches and knitr this is undesirable. This has now been removed. From NEWS for v1.8.9 (rev 851) :
- % progress console meter has been removed. The ouput was inconvenient in batch mode, log files and reports which don't handle
\r
. It was too difficult to detect wherefread
is being called from, plus, removing it speeds upfread
a little by saving code inside the C for loop (which is why it wasn't made optional instead). Use your operating system's system monitor to confirm fread is progressing. Thanks to Baptiste for highlighting :
Strange output from fread when called from knitr
Just a quick reminder for completeness. From the top of ?fread
:
This function is still under development. For example, dates are read
as character (they can be converted afterwards using the excellent
fasttime package or standard base functions) and embedded quotes ("\""
and """") have problems. There are other known issues that haven't
been fixed and features not yet implemented. But, you may find it
works in many cases. Please report problems to datatable-help or Stack
Overflow's data.table tag.Not for production use yet. Not because it's unstable in the sense
that it crashes or is buggy (your testing will show whether it is
stable in your cases or not) but because fread's arguments and
behaviour is likely to change in future; i.e., we expect to make
(hopefully minor) non-backwards-compatible changes. Why has it been
released to CRAN then? Because a maintenance release was asked for by
CRAN maintainers to comply with new stricter tests in R-devel, and a
few Bioconductor packages depend on data.table and Bioconductor
requires packages to pass R-devel checks. It was quicker to leave
fread in and write these paragraphs, than take fread out.
Related Topics
Rselenium on Docker: Where Are Files Downloaded
How to Calculate Euclidean Distance Between Two Matrices in R
Quantiles by Factor Levels in R
Converting an Xts Object to a Data.Frame
Adding a Layer to The Current Plot Without Creating a New One in Ggplot2
When/How/Where Is Parent.Frame in a Default Argument Interpreted
Error: Attempt to Use Zero-Length Variable Name
Ggplot2 Violin Plot: Fill Central 95% Only
Combining Date and Time into a Date Column for Plotting
Classification Functions in Linear Discriminant Analysis in R
Write a File Using 'saverds()' So That It Is Backwards Compatible with Old Versions of R
Assigning/Referencing a Column Name in Data.Table Dynamically (In I, J and By)
Generating Split-Color Rectangles from Ggplot2 Geom_Raster()
R Plotly: Preserving Appearance of Two Legends When Converting Ggplot2 with Ggplotly