我正在寻找一种比我必须用 R 语言组织我的项目更好的解决方法。目前,我使用RStudio IDE,它提供了一个不错的项目管理和版本控制功能。我认为默认的 RStudio 项目管理对我有好处,只要分析结果是为我的工作准备的,即我可以跟踪.Rproj
在 RStudio 项目环境中使用的结果和数据源,并在将来重现结果。
但是,我还与实验室的同事(生物学家)合作,使用相同的数据源进行特定类型的微观分析或任务。这会产生几个问题,例如,
在同一个 RStudio 项目文件下对多个任务运行分析,
.Rproj
并可能丢失对给定任务使用了哪组脚本文件的跟踪。或者,我可以创建特定于任务的 .Rproj 文件,但这对我来说不太可取,因为我最终会创建许多 R 项目目录。此外,.Rproj
是 RStudio IDE 特定文件。因此,如果我从控制台运行 R,我发现很难.R
在父项目目录下获取用于其中一项任务的一个或多个脚本。第二个也是更重要的问题是,当我将结果传递给同事并且他/她在一年左右后返回给我以重新运行相同类型的分析而分析参数几乎没有变化时。在大多数情况下,我无法简单地通过文件名或数据格式进行跟踪,因为它们已根据他/她的偏好进行了重新组织。
我想实现用户定义的项目或任务名称、UUID 和时间戳的组合,以在同一个项目中定义我的每个项目或任务(subversions)。这样,我可以将这个唯一的 UUID 连同结果一起传递给同事,并且最好将此 UUID 嵌入结果文件/文件名中,以便将来进行跟踪和重现。
我已采取以下解决方法来分配唯一的项目 ID。它基本上有三种情况。
为当前工作目录创建一个唯一的项目 ID:
getwd()
[1] "/home/foo/project1"
project.id("Hello World")
[1] "Project ID is: Hello World--0f62f1de-4187-11e3-89af-b7d1cb3029b4--30-Oct-2013-12-17-57-CDT"
[1] "Project_ID file is at: /home/foo/project1/DO_NOT_DELETE_project_ID_30-Oct-2013-12-17-57-CDT.txt"
如果当前工作目录中已经存在 UUID,则提示用户输入 y/n:
project.id("Project 2")
[1] "Possible Project ID file(s) exists at: /home/foo/project1/"
[1] "DO_NOT_DELETE_project_ID_30-Oct-2013-12-17-57-CDT.txt"
如果用户拒绝,命令返回当前项目 ID。
Do you want to make new subversion under this project? Say either yes or no: n
[1] "Running project under the project ID: /home/foo/project1/DO_NOT_DELETE_project_ID_30-Oct-2013-12-17-57-CDT.txt"
[1] "Project ID is: Hello World--0f62f1de-4187-11e3-89af-b7d1cb3029b4--30-Oct-2013-12-17-57-CDT"
如果用户说是,命令只修改时间戳并输出新_<timestamp>_subversioned.txt
文件。但是,后一个文件将保留在父项目开始时创建的原始用户定义项目标题和 UUID。
Do you want to make new subversion under this project? Say either yes or no: y
[1] "Project ID is: Hello World--0f62f1de-4187-11e3-89af-b7d1cb3029b4--30-Oct-2013-12-25-02-CDT--subversioned"
[1] "SUBVERSIONED Project_ID file is at: /home/foo/project1/DO_NOT_DELETE_project_ID_30-Oct-2013-12-25-02-CDT_subversioned.txt"
[1] "Previous Project ID file(s) exists at: /home/foo/project1/DO_NOT_DELETE_project_ID_30-Oct-2013-12-17-57-CDT.txt"
Warning message:
In project.id("Project 2") :
Possible Project ID file(s) exists at: /home/foo/project1/DO_NOT_DELETE_project_ID_30-Oct-2013-12-17-57-CDT.txt
我认为我的脚本(如下)是一种让项目管理更简单的复杂方法!但是,我想看看我是否可以使用特定于任务的 UUID 来跟踪与实验室同事共享的分析。
谢谢,
山姆
R 脚本:分配一个唯一的项目 UUID:
project.id <- function (project_title = as.character()) {
chk_id_file <- list.files(path=getwd(),pattern="DO_NOT_DELETE_project_ID",recursive=F,ignore.case=F)
if(length(chk_id_file) == 0) {
stitle <- ifelse(is.na(project_title[1]), readline("Provide short project title: "), project_title)
tstamp <- format(Sys.time(),"%d-%b-%Y-%H-%M-%S-%Z")
projid <- paste(as.character(stitle),system("uuid",intern=T),tstamp,sep="--")
fname <- paste0("DO_NOT_DELETE_project_ID_",tstamp,".txt")
write.table(projid,fname,quote=F,row.names=F,col.names=F)
print(paste0("Project ID is: ",projid))
print(paste0("Project_ID file is at: ",getwd(),"/",fname))
}
else
{ print(paste0("Possible Project ID file(s) exists at: ",getwd(),"/"))
print(chk_id_file)
uprompt1 <- readline("Do you want to make new subversion under this project? Say either yes or no: ")
if (grepl("y",uprompt1,ignore.case=T)) {
warning(paste0("Possible Project ID file(s) exists at: ",getwd(),"/",chk_id_file))
subtitle <- readLines(paste0(getwd(),"/",chk_id_file[1]))
library(stringr)
stitle <- str_extract(string=subtitle,".*[a-z0-9]{12}")
tstamp <- format(Sys.time(),"%d-%b-%Y-%H-%M-%S-%Z")
projid <- paste(as.character(stitle),tstamp,"subversioned",sep="--")
fname <- paste0("DO_NOT_DELETE_project_ID_",tstamp,"_subversioned.txt")
write.table(projid,fname,quote=F,row.names=F,col.names=F)
print(paste("Project ID is: ",projid,sep=""))
print(paste0("SUBVERSIONED Project_ID file is at: ",getwd(),"/",fname))
print(paste0("Previous Project ID file(s) exists at: ",getwd(),"/",chk_id_file))
}
else {
parentprojid <- grep("subversioned",chk_id_file,invert=T)
parentprojid_read <- readLines(paste0(getwd(),"/",chk_id_file[parentprojid]))
print(paste0("Running project under the project ID: ",getwd(),"/",chk_id_file[parentprojid]))
print(paste0("Project ID is: ",parentprojid_read))
}
}
}