script - source on save r
Rscript: No hay ningĂșn paquete llamado...? (3)
Como se mencionó en los comentarios, parece que Rscript no reconoce los valores predeterminados de la ruta de la biblioteca automáticamente. Estoy escribiendo una secuencia de comandos R que necesita ser fuente de la línea de comandos en las computadoras de diferentes personas, por lo que se me ocurrió una solución más general:
- Primero almacene la ruta de la biblioteca predeterminada en una variable (las funciones de origen Rscript pueden encontrar esto, simplemente no lo hacen automáticamente)
- Luego incluya esa ruta en la llamada de
library()
conlib.loc =
argumento. Esto debería funcionar independientemente de cuál sea la ruta en una computadora determinada.
library.path <- .libPaths() library("timeseries", lib.loc = library.path)
Gracias de nuevo a @flodel arriba por ponerme en el camino correcto
Quiero ejecutar archivos R en modo de proceso por lotes utilizando Rscript, sin embargo, no parece estar cargando las bibliotecas que necesito. El error específico que estoy recibiendo es:
Error in library(timeSeries) : there is no package called ''timeSeries''
Execution halted
Sin embargo, tengo el paquete timeSeries
y puedo cargarlo desde Rstudio, RGui y R desde la línea de comandos, no hay problema. El problema parece ser solo cuando se ejecuta un script utilizando Rscript.
Mis variables de sistema / entorno se configuran como:
C:/Program Files/R/R-3.1.0/bin/x64 (Appended to PATH)
R_HOME = C:/Program Files/R/R-3.1.0
R_User = Patrick
Estoy ejecutando la misma versión de R en RStudio, RGui y R desde la línea de comandos. También verifiqué .Library
desde estas tres fuentes y obtuve la misma salida también.
¿Cómo puedo ejecutar Rscript desde la línea de comandos con los paquetes que estoy usando (y he instalado) en R?
EDITAR:
Estoy utilizando Rscript a través de Rscript script.r
en la línea de comandos de Windows en el directorio donde se encuentra script.r
.
La salida de Rscript -e print(.Library)
es [1] "C:/PROGRA~1/R/R-31~1.0/library"
que concuerda con las otras tres opciones que mencioné: [1] "C:/PROGRA~1/R/R-31~1.0/library"
Sin embargo, si pongo esto en mi guión:
print(.libPaths())
library(timeSeries) #This is the package that failed to load
Obtengo una salida de:
[1] "C:/Program Files/R/R-3.1.0/library"
Error in library(timeSeries) : there is no package called ''timeSeries''
Execution halted
La llamada correspondiente en RStudio proporciona una ruta adicional a la ubicación real del paquete:
> print(.libPaths())
[1] "C:/Users/Patrick/Documents/R/win-library/3.1" "C:/Program Files/R/R-3.1.0/library"
En resumen, el valor devuelto al llamar a Sys.getenv(''R_LIBS_USER'')
en R.exe debe ser el mismo que el valor devuelto al llamar a esto en la línea de comandos:
Rscript.exe -e "Sys.getenv(''R_LIBS_USER'')"
y el valor anterior debe incluirse en esta llamada de línea de comando:
Rscript.exe -e ".libPaths()"
Tenga en cuenta que los valores de R_LIBS_USER
pueden diferir entre R.exe y Rscript.exe si se cambia el valor de R_USER
, ya sea en el .Rprofile
o en el campo de destino del acceso directo del usuario a R.exe
, y en general, encuentro que la biblioteca del usuario (es decir, .libPaths()[2]
) simplemente no está configurada en Rscript.exe
Ya que me gusta establecer R_USER
en mi R_USER
, R_USER
el siguiente bloque en la parte superior de los archivos .R
que deseo ejecutar en varias computadoras o en el perfil de .Rprofile
(es decir, Rscript -e "path.expand(''~/.Rprofile'')"
):
# =====================================================================
# For compatibility with Rscript.exe:
# =====================================================================
if(length(.libPaths()) == 1){
# We''re in Rscript.exe
possible_lib_paths <- file.path(Sys.getenv(c(''USERPROFILE'',''R_USER'')),
"R","win-library",
paste(R.version$major,
substr(R.version$minor,1,1),
sep=''.''))
indx <- which(file.exists(possible_lib_paths))
if(length(indx)){
.libPaths(possible_lib_paths[indx[1]])
}
# CLEAN UP
rm(indx,possible_lib_paths)
}
# =====================================================================
Esta respuesta no ayudará al autor de la pregunta original (pbreach), pero puede ayudar a otra persona que tropieza con esta pregunta y tiene un problema similar para mí.
Tengo muchos archivos de script bash
.sh
que llaman a RScript
para ejecutar archivos RScript
. Mi sistema operativo es Windows 10
, y ejecuto esos archivos bash
usando cygwin
.
Todo había funcionado bien hasta ayer, cuando finalmente actualicé mi R
de Revolution R 8.0.1 beta
a Microsoft R Open 3.4.1
. Después de esa actualización, todos los scripts de bash que llamaron RScript
fallaron debido a la misma razón que se pregunta aquí (por ejemplo, Error in library(zoo) : there is no package called ''zoo''
).
La investigación reveló que RScript
realmente funcionaba bien si se llamaba desde un DOS shell
lugar de un shell bash cygwin.
Por ejemplo, si ejecuto esto en un DOS shell
C:/Progra~1/Microsoft/ROpen~1/R-3.4.1/bin/x64/Rscript.exe -e ".libPaths()"
Veo la salida
[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"
Eventualmente descubrí la razón. Como se explica en la R_USER
R Preguntas frecuentes , para definir su directorio de inicio, R
primero utilizará la variable de entorno R_USER
si está definida, de lo contrario, utilizará la variable de entorno HOME
si está definida, de lo contrario utilizará el directorio "personal" de Windows.
Mi configuración de Windows no define las variables de entorno R_USER
o HOME
. Entonces, en el caso de DOS shell
, R
usa mi directorio "personal" de Windows ( C:/Users/HaroldFinch/Documents
). Eso es bueno, porque ahí es donde están instaladas todas mis bibliotecas ( C:/Users/HaroldFinch/Documents/R/win-library/3.4
).
En contraste, cygwin
define y exporta una variable de entorno HOME
que apunta a mi directorio de usuarios de cygwin
, que carece de cualquier cosa de R
Por lo tanto, RScript
llamado desde cygwin
tenía un directorio de inicio R
incorrecto, y por lo tanto no pudo cargar las bibliotecas.
Probablemente hay muchas maneras de resolver esto. Decidí que mi script de bash configurara una variable de entorno R_USER
que apunte a mi directorio de usuarios de Windows.
Por ejemplo, si ejecuto esto en un cygwin bash shell
:
R_USER="C:/Users/HaroldFinch/Documents"
export R_USER
/cygdrive/c/Progra~1/Microsoft/ROpen~1/R-3.4.1/bin/x64/Rscript.exe -e ".libPaths()"
Veo la salida
[1] "C:/Users/HaroldFinch/Documents/R/win-library/3.4"
[2] "C:/Program Files/Microsoft/R Open/R-3.4.1/library"
que es exactamente la misma salida ahora que el ejemplo de shell de DOS anterior.