【发布时间】:2016-07-11 11:45:31
【问题描述】:
我有一个 R 脚本,它从多个 xlsx 文件中读取数据,将它们转换为数据框,然后根据数据框的行值在我的计算机上的目录中创建文件夹。我已经在我的代码开头设置了主目录:
choose.dir(getwd(), "Choose a suitable folder")
以及创建文件夹的输出目录,如:
pth <- "C:/Users/Dev/Desktop/test/"
我想在多台计算机上运行脚本,这意味着名为 pth 的输出目录不会总是相同。有没有办法设置相对输出路径,以便每次我运行脚本来指定我希望我的结果位于何处?我试过了
pth <- choose.dir(default = "", caption = "Choose the output path")
虽然会弹出一个对话窗口并选择所需的目录,但我看不到那里的任何文件夹。
这是我目前的代码:
#choose working directory
choose.dir(getwd(), "Choose a suitable folder")
library(xlsx)
library(tcltk)
#get file names
f = list.files("./")
#read files
dat <- lapply(tk_choose.files(caption="Choose your files"), function(i) {
x <- read.xlsx(i, sheetIndex = 1, sheetName = NULL, startRow = 24,
endRow = NULL, as.data.frame = TRUE, header = FALSE, Filters = Filters[c("xlsx")])
#return columns with names and colors
x <- x[, c(2, 5, 7, 9, 11, 13, 15, 17, 19), drop = FALSE]
#return the data
x
})
library(plyr)
df1 <- ldply(dat, data.frame) ## convert list into a dataframe
#remove NA's
complete.cases(df1)
x <- df1[complete.cases(df1),]
str(x)
#show specific rows
df1$X2 <- gsub("[[:punct:]]","-",df1$X2)
df <-df1[grepl("^[0-9]|^[a-zA-Z][0-9].*", df1$X2), ]
#print(df)
##pth <- "C:/Users/Dev/Desktop/test/"
pth = choose.dir(default = "", caption = "Choose the output path")
# Iteratate within each row of df
for(i in 1:nrow(df)){
if (!file.exists(pth))
# Create 1st path
dir.create(paste0(pth , df$X2[i]), na.omit(df$X2[i]))
# Create 2nd and 3rd paths
dir.create(paste0(pth, df$X2[i], "/",df$X5[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X7[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X9[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X11[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X13[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X15[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X17[i]), na.omit(df$X2[i]))
dir.create(paste0(pth, df$X2[i], "/",df$X19[i]), na.omit(df$X2[i]))
}
【问题讨论】:
-
您可以使用主目录(存储为环境变量 HOME,R 通过
Sys.getenv("HOME")访问)并通过pth <- "~/Desktop/test/"设置相对于该主路径的路径 -
Denise 谢谢,但
Sys.getenv("HOME")返回 "C:/Users/Dev/Documents" 并且我没有显示输出。此外,在其他计算机中,输出可能需要显示在不同的目录中,不一定在~/Desktop/test/中。我可以使用更通用的语句,以便每次有人运行它时,他们都可以选择在哪里输出数据? -
我不确定您到底在开发什么,但您可以将脚本编写为函数,并将本地目录的路径作为函数输入提供,并通过
MyFunction("path/to/local/directory/")在每台机器上调用该函数.如果这不合适,您可以设置一个不同的环境变量LOCAL_DIRECTORY(或者您想调用它)并以与脚本内的主目录相同的方式访问它。缺点是您必须设置此环境在能够运行 R 代码之前在每台机器上进行变量
标签: r