Se me ocurrió la siguiente solución, que funcionará para archivos de menos de 2^32 - 1 bytes.
El objeto R necesita ser serializado y guardado en un archivo, como lo hace el siguiente código.
saveObj <- function(object, file.name){
outfile <- file(file.name, "wb")
serialize(object, outfile)
close(outfile)
}
Luego leemos los datos binarios en fragmentos, haciendo un seguimiento de cuánto se lee y actualizando la barra de progreso en consecuencia.
loadObj <- function(file.name){
library(foreach)
filesize <- file.info(file.name)$size
chunksize <- ceiling(filesize/100)
pb <- txtProgressBar(min = 0, max = 100, style=3)
infile <- file(file.name, "rb")
data <- foreach(it = icount(100), .combine = c) %do% {
setTxtProgressBar(pb, it)
readBin(infile, "raw", chunksize)
}
close(infile)
close(pb)
return(unserialize(data))
}
El código se puede ejecutar de la siguiente manera:
> a <- 1:100000000
> saveObj(a, "temp.RData")
> b <- loadObj("temp.RData")
|======================================================================| 100%
> all.equal(b, a)
[1] TRUE
Si referente al método barra de progreso en contra de leer el archivo en un único trozo vemos el método barra de progreso es un poco más lento, pero no lo suficiente preocuparse de.
> system.time(unserialize(readBin(infile, "raw", file.info("temp.RData")$size)))
user system elapsed
2.710 0.340 3.062
> system.time(b <- loadObj("temp.RData"))
|======================================================================| 100%
user system elapsed
3.750 0.400 4.154
Así que, aunque el método anterior funciona, creo que es completamente inútil debido a las restricciones de tamaño de archivo. Las barras de progreso solo son útiles para archivos grandes que tardan mucho tiempo en leerse.
¡Sería genial si alguien pudiera encontrar algo mejor que esta solución!
No sé cómo hacer una barra de progreso, pero ¿ha considerado al menos mostrar un temporizador? Encuentro que ejecutar un temporizador hace que la espera pase más rápido, y luego sé que el programa aún está respondiendo. Puede mostrar un mensaje como 'Usted ha estado esperando 1:32 y la espera es normalmente ~ 3 minutos. ¡Tómate un café! ' –
Dos preguntas anteriores: http://stackoverflow.com/questions/5423760/how-do-you-create-a-progress-bar-when-using-the-foreach-function-in-r/ 6170107 # 6170107 y http://stackoverflow.com/q/3820402/583830 sugieren 'txtProgressBar' y' gtkProgressBar'. El último es del paquete RGtk2. ¿Es esto lo que estás buscando? – jthetzel
Lo siento, eché de menos que ya conoces la función 'txtProgressBar' y que tu pregunta es sobre cargar archivos .Rdata. – jthetzel