Get the path of current script
In RStudio, you can get the path to the file currently shown in the source pane using
rstudioapi::getSourceEditorContext()$path
If you only want the directory, use
dirname(rstudioapi::getSourceEditorContext()$path)
If you want the name of the file that's been run by source(filename)
, that's a little harder. You need to look for the variable srcfile
somewhere back in the stack. How far back depends on how you write things, but it's around 4 steps back: for example,
fi <- tempfile()
writeLines("f()", fi)
f <- function() print(sys.frame(-4)$srcfile)
source(fi)
fi
should print the same thing on the last two lines.
Getting path of an R script
Use source("yourfile.R", chdir = T)
How to get the directory of the executing script in R?
Collecting resources from multiple questions in SO, I came up with the following solution, that seems to work with multiple calling conventions:
library(base)
library(rstudioapi)
get_directory <- function() {
args <- commandArgs(trailingOnly = FALSE)
file <- "--file="
rstudio <- "RStudio"
match <- grep(rstudio, args)
if (length(match) > 0) {
return(dirname(rstudioapi::getSourceEditorContext()$path))
} else {
match <- grep(file, args)
if (length(match) > 0) {
return(dirname(normalizePath(sub(file, "", args[match]))))
} else {
return(dirname(normalizePath(sys.frames()[[1]]$ofile)))
}
}
}
Which later I can use as:
path <- paste(get_directory(), "/output/", filename, sep = "")
How to get the absolute path from the context of the current running R script?
R has in general no way of finding this path, because there is no equivalent to Python’s __file__
in R.
The closest you can get is to look at commandArgs()
and laboriously extract the script filename (which requires different handling depending on how the script was launched!). But this will fail if the script was executed in RStudio, and it will fail after calling setwd()
.
Other solutions (such as the ‘here’ package) rely on heuristics and specific project structures.
But luckily there’s actually a solution that will always work: use ‘box’ modules.
With modules, you’ll always be able to get the path of the current script/module via box::file()
. This is the closest equivalent to Python’s __file__
you’ll get in R, and it always works — as long as you’re using ‘box’ modules consistently.
(Internally the ‘box’ package requires complex logic to determine the value of the file()
function in all circumstances; I don’t recommend replicating it, it’s too complex. For the curious, the bulk of the relevant logic is in R/loaded.r
.)
How to get the script path in R?
if you run script by source
, then try source(file, chdir = TRUE)
.
Find location of current .R file
somewhere in the "load the script" process, you are passing the name and path of the R script.
I'm suggesting to capture that information and then use a wrapper script to execute your main script.
Option 1 (programatically)
the wrapper function that takes as an argument the path and fiile name of the script to execute
FILE <- "~/Desktop/myFolder/InHere/myScript.R"
Option 2 (interactively)
at the start of your wrapper function, let the user click through to the file:
FILE <- file.choose()
THEN:
DIR <- dirname(FILE)
and there you have your directory/folder and you can execute your script as normal passing DIR
as a parameter
Related Topics
Measuring Function Execution Time in R
Remove Columns from Dataframe Where All Values Are Na
Read All Files in a Folder and Apply a Function to Each Data Frame
How to Change the Default Library Path For R Packages
Dplyr Filter: Get Rows With Minimum of Variable, But Only the First If Multiple Minima
How to Display Only Integer Values on an Axis Using Ggplot2
What Is Meaning of First Tilde in Purrr::Map
Error - Replacement Has [X] Rows, Data Has [Y]
Replace Na in Column With Value in Adjacent Column
Horizontal/Vertical Line in Plotly
How to Order Data by Value Within Ggplot Facets
How to Delete Rows from a Dataframe That Contain N*Na
Call Apply-Like Function on Each Row of Dataframe With Multiple Arguments from Each Row
Test If Characters Are in a String
Programming With Dplyr Using String as Input
Sample from Vector of Varying Length (Including 1)
Using the Rjava Package on Win7 64 Bit With R
How to Read a CSV File in R With Different Number of Columns