我正在使用Rscript从某个目录中的CSV文件中绘制一些图形,这个目录不一定是我当前的工作目录。
./script.r ../some_directory/inputfile.csv
现在我想在同一个目录(../some_directory)中输出我的图形,但我不知道如何做到这一点。我试图获得输入文件的绝对路径,因为从这里我可以构造输出路径,但我找不到如何做到这一点。
a7qyws3x1#
normalizePath() #Converts file paths to canonical user-understandable form
或
library(tools) file_path_as_absolute()
zwghvu4y2#
使用normalizePath(dirname(f))。下面的示例列出了当前目录中的所有文件和目录。
normalizePath(dirname(f))
dir <- "." allFiles <- list.files(dir) for(f in allFiles){ print(paste(normalizePath(dirname(f)), fsep = .Platform$file.sep, f, sep = "")) }
其中:
.Platform
file.sep
A/B/a_file
B
dir <- "B" allFiles <- list.files(dir) for(f in allFiles){ print(paste(normalizePath(dirname(f)), fsep = .Platform$file.sep, f, sep = "")) }
将得出:
> A/a_file
但是,它应该是:
> A/B/a_file
jexiocij3#
这里的解决方案:
args = commandArgs(TRUE) results_file = args[1] output_path = dirname(normalizePath(results_file))
ctrmrzij4#
为什么不把R基函数file.path()和@Marius给出的答案结合起来呢?这看起来稍微简单一点,可以处理一个文件向量(files),并且可以处理系统特定的分隔符:
file.path()
files
file.path(normalizePath(dirname(files)), files)
并 Package 在函数(abspath)中:abspath <- function(files)file.path(normalizePath(dirname(files)), files)例如:
abspath
abspath <- function(files)file.path(normalizePath(dirname(files)), files)
> setwd("~/test") > list.files() [1] "file1.txt" "file2.txt"
然后:
> abspath(files) [1] "/home/myself/test/file1.txt" "/home/myself/test/file2.txt"
vmdwslir5#
我看到人们给出了解决方案的一部分,但不是全部。
outputFile = paste(normalizePath(dirname(inputFile)),"\\", "my_file.ext", sep = "")
希望有帮助。
ngynwnxp6#
fs::path_abs()是最快的方法。
fs::path_abs()
6条答案
按热度按时间a7qyws3x1#
或
zwghvu4y2#
使用
normalizePath(dirname(f))
。下面的示例列出了当前目录中的所有文件和目录。其中:
normalizePath(dirname(f))
给出了父目录的绝对路径,因此应该将各个文件名添加到路径中。.Platform
用于具有OS可移植代码。(here)file.sep
给出"您的平台上使用的文件分隔符:"/"在类Unix系统和Windows系统上(但在以前的Classic Mac OS端口上没有)。"(here)A/B/a_file
,工作目录现在设置为B
。然后执行以下代码:将得出:
但是,它应该是:
jexiocij3#
这里的解决方案:
ctrmrzij4#
为什么不把R基函数
file.path()
和@Marius给出的答案结合起来呢?这看起来稍微简单一点,可以处理一个文件向量(files
),并且可以处理系统特定的分隔符:并 Package 在函数(
abspath
)中:abspath <- function(files)file.path(normalizePath(dirname(files)), files)
例如:
然后:
vmdwslir5#
我看到人们给出了解决方案的一部分,但不是全部。
希望有帮助。
ngynwnxp6#
fs::path_abs()
是最快的方法。