r

r - shiny using html



Encuentra la ubicaciĆ³n del archivo.R actual (4)

He revisado muchas preguntas similares a esta (vea el final del post), pero no he encontrado ninguna solución que realmente cumpla con lo que necesito. Codifico en Windows o Fedora, dependiendo del proyecto, y codifico para las personas que usan Windows y varias distribuciones de Linux.

Parte de mi trabajo es hacer scripts R para personas que analizan datos automáticamente y crean gráficos. Más comúnmente, les enviaré el script y generará el gráfico. De esta manera, si los datos cambian o se expanden, no necesito volver a ejecutar el script para ellos (también, pueden realizar cambios según sea necesario).

El problema es que no sé cómo obtener una secuencia de comandos R para averiguar dónde se encuentra. Sería muy conveniente simplemente poder crear código que funcione de la siguiente manera:

  1. El usuario guarda el script en la carpeta que contiene datos y luego ejecuta el script.
    • Por lo general, simplemente le envío el script a la persona con la que estoy trabajando.
    • Guardan el script en una carpeta que contiene los datos que desean analizar / graficar.
    • Lo ideal sería que solo lanzaran R, cargaran el script y luego ejecutaran el script.
  2. La secuencia de comandos determina su propia ubicación, luego la establece como el directorio de trabajo.
  3. El script analiza los datos dentro de su propio directorio.
  4. La secuencia de comandos genera gráficos y los guarda en su propio directorio.

Esta pregunta solo trata con el Paso 2. Todo lo demás fluye bien siempre que pueda lograrlo. Sería bueno tener algo como:

setwd(FindThisScriptsLocation())

La línea: source (..., chdir = T) se ha sugerido here , pero no se puede usar para que una secuencia de comandos haga referencia a sí misma a menos que sepa su propia ruta.

Aquí hay algunas preguntas relacionadas:


En algún lugar del proceso de "cargar el script" , está pasando el nombre y la ruta del script R. Sugiero capturar esa información y luego usar un script de envoltorio para ejecutar su script principal.

Opción 1 (programáticamente)

la función de contenedor que toma como argumento la ruta y el nombre de archivo del script para ejecutar

FILE <- "~/Desktop/myFolder/InHere/myScript.R"

Opción 2 (interactivamente)

al inicio de su función de envoltorio, permita que el usuario haga clic en el archivo:

FILE <- file.choose()

ENTONCES:

DIR <- dirname(FILE)

y ahí tienes tu directorio / carpeta y puedes ejecutar tu script como pasa normalmente el DIR como parámetro


Oye, tengo una posible solución que es un poco de trabajo inicial adicional, pero debería poder hacer lo que necesites.

Primero haga que su script R tome un parámetro que sea la ubicación del script. A continuación, solo necesita crear un Bash / Batch (uno para Windows y UNIX) que

1) obtener su propio directorio

2) buscar en el directorio un script R (búsqueda simple * .R)

3) llamar al script R con su propio directorio desde el paso 1.

Luego, simplemente empaqueta los scripts Bash y Batch con la carpeta que le da a sus clientes y pídales que solo ejecuten el script relevante para su entorno.

En teoría, solo debe crear los scripts Bash / Batch una vez.

EDITAR: He creado un script bash simple que funciona para este problema, vea a continuación

#!/bin/bash #Modify the search string to narrow the search SEARCH_STRING="*.R" #Get the current directory DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo ${DIR} #Get the name of the R script R_SCRIPT=`find $DIR -name ${SEARCH_STRING} -type f -exec basename {} /;` echo ${R_SCRIPT} Rscript ${R_SCRIPT} ${DIR}

No estoy muy versado en el Shell de Windows, así que tendrás que hacerlo tú mismo: P

Puedes probarlo con este script R;

options(echo = FALSE) #So we don''t get the script echo''d arguments <- commandArgs(trailingOnly = TRUE) #getting the arguments working_directory <- arguments[1] setwd(working_directory) getwd() #print out to test


Supongo que esto es Windows.

Siguiendo la sugerencia de Ricardo: haga que los sistemas del cliente se configuren de forma que, si se hace doble clic en un script, el intérprete R se inicie en el directorio del script. También puede asignar una extensión especial para este comportamiento (por ejemplo, .Rwd para " .Rwd de comandos R que configura el directorio de trabajo"). Entonces, no necesitas setwd() dentro del script.

Para empezar, el siguiente script de línea de comandos podría hacer (sin probar):

pushd %~d1%~p1 R --vanilla < "%1"

.Rwd archivos .Rwd con este script.

Si necesita source() otros scripts, considere usar el argumento chdir=T


Tenía el mismo problema, esto es lo que se me ocurrió. Funciona con source () y rmarkdwon :: render () en Windows y en Linux.

Actualización: la función get_scriptpath () ahora está disponible como parte de mi paquete envDocument en CRAN. Consulte https://cran.r-project.org/package=envDocument

#'' Get the path of the calling script #'' #'' /code{get_scriptpath} returns the full path of the script that called this function (if any) #'' or NULL if path is not available #'' #'' @examples #'' mypath <- get_scriptpath() #'' @export #'' get_scriptpath <- function() { # location of script can depend on how it was invoked: # source() and knit() put it in sys.calls() path <- NULL if(!is.null(sys.calls())) { # get name of script - hope this is consisitent! path <- as.character(sys.call(1))[2] # make sure we got a file that ends in .R, .Rmd or .Rnw if (grepl("..+//.[R|Rmd|Rnw]", path, perl=TRUE, ignore.case = TRUE) ) { return(path) } else { message("Obtained value for path does not end with .R, .Rmd or .Rnw: ", path) } } else{ # Rscript and R -f put it in commandArgs args <- commandArgs(trailingOnly = FALSE) } return(path) }