追风的匕首 · activeperl 离线安装包 - CSDN文库· 2 周前 · |
很拉风的沙滩裤 · 在python脚本中获取执行shell命令所 ...· 2 周前 · |
急躁的手套 · crontab ...· 6 天前 · |
英姿勃勃的闹钟 · 开润股份范劲松:互联网赋能下的高增长逻辑_手 ...· 1 月前 · |
重情义的烤红薯 · 汽车抬头显示HUD未来两年即将爆发,产业链地 ...· 12 月前 · |
紧张的电梯 · 镇魂街争议话题解析 - 知乎· 1 年前 · |
愤怒的菠菜 · 百兆交换机是总共100M还是每个端口100M ...· 1 年前 · |
豁达的斑马 · 小李子微博成表情包集散地 ...· 1 年前 · |
有没有办法以编程方式找到R脚本本身内部的路径?
我之所以这样问,是因为我有几个使用
RGtk2
并从.glade文件加载图形用户界面的脚本。
在这些脚本中,我必须在开头放置一条
setwd("path/to/the/script")
指令,否则将找不到.glade文件(位于同一目录中)。
这很好,但如果我将脚本移动到不同的目录或另一台计算机上,我必须更改路径。我知道,这不是什么大事,但如果能有这样的东西就好了:
setwd(getScriptPath())
那么,是否存在类似的函数呢?
如果您将代码包装在包中,则始终可以查询包目录的某些部分。
下面是RGtk2包中的一个示例:
> system.file("ui", "demo.ui", package="RGtk2")
[1] "C:/opt/R/library/RGtk2/ui/demo.ui"
>
您可以对源代码中的目录
inst/glade/
执行相同的操作,该目录将成为已安装软件包中的
glade/
目录--
system.file()
将在安装时为您计算路径,而与操作系统无关。
使用
source("yourfile.R", chdir = T)
这个答案对我来说很好:
script.dir <- dirname(sys.frame(1)$ofile)
注意:必须获取脚本才能返回正确的路径
但是我还是不明白什么是sys.frame(1)$ofile。我在R文档中没有找到任何关于这方面的东西。有人能解释一下吗?
这对我来说很有效:
getSrcDirectory(function(x) {x})
这将在脚本中定义一个匿名函数(不执行任何操作),然后确定该函数的源目录,即脚本所在的目录。
#' current script dir
#' @param
#' @return
#' @examples
#' works with source() or in RStudio Run selection
#' @export
z.csd <- function() {
# http://stackoverflow.com/questions/1815606/rscript-determine-path-of-the-executing-script
# must work with source()
if (!is.null(res <- .thisfile_source())) res
else if (!is.null(res <- .thisfile_rscript())) dirname(res)
# http://stackoverflow.com/a/35842176/2292993
# RStudio only, can work without source()
else dirname(rstudioapi::getActiveDocumentContext()$path)
# Helper functions
.thisfile_source <- function() {
for (i in -(1:sys.nframe())) {
if (identical(sys.function(i), base::source))
return (normalizePath(sys.frame(i)$ofile))
.thisfile_rscript <- function() {
cmdArgs <- commandArgs(trailingOnly = FALSE)
cmdArgsTrailing <- commandArgs(trailingOnly = TRUE)
cmdArgs <- cmdArgs[seq.int(from=1, length.out=length(cmdArgs) - length(cmdArgsTrailing))]
res <- gsub("^(?:--file=(.*)|.*)$", "\\1", cmdArgs)
# If multiple --file arguments are given, R uses the last one
res <- tail(res[res != ""], 1)
if (length(res) > 0)
return (res)
}
使用system和shell命令怎么样?对于windows one,我认为当您在RStudio中打开脚本时,它会将当前的shell目录设置为脚本所在的目录。您可能必须添加cd C:\例如G或您想要搜索的任何驱动器(例如shell('dir C:\*file_name /s',intern = TRUE) -\以转义转义字符)。只适用于唯一命名的文件,除非您进一步指定子目录(对于Linux,我是从/开始搜索的)。在任何情况下,如果您知道如何在shell中查找某些内容,这将提供一个在R中查找它并返回目录的布局。无论你是采购还是运行脚本,都应该可以工作,但我还没有充分研究潜在的bug。
#Get operating system
OS<-Sys.info()
win<-length(grep("Windows",OS))
lin<-length(grep("Linux",OS))
#Find path of data directory
#Linux Bash Commands
if(lin==1){
file_path<-system("find / -name 'file_name'", intern = TRUE)
data_directory<-gsub('/file_name',"",file_path)
#Windows Command Prompt Commands
if(win==1){
file_path<-shell('dir file_name /s', intern = TRUE)
file_path<-file_path[4]
file_path<-gsub(" Directory of ","",file_path)
filepath<-gsub("\\\\","/",file_path)
data_directory<-file_path
#Change working directory to location of data and sources
setwd(data_directory)
谢谢你的功能,尽管我不得不稍微调整一下,如下所示(W10):
#Windows Command Prompt Commands
if(win==1){
file_path<-shell('dir file_name', intern = TRUE)
file_path<-file_path[4]
file_path<-gsub(" Verzeichnis von ","",file_path)
file_path<-chartr("\\","/",file_path)
data_directory<-file_path
}
这些解决方案中的许多都有好几年的历史了。虽然有些可能仍然有效,但有充分的理由反对使用它们中的每一个(参见下面的链接来源)。我有一个最好的解决方案(也来自源代码):使用
here
库。
原始示例代码:
library(ggplot2)
setwd("/Users/jenny/cuddly_broccoli/verbose_funicular/foofy/data")
df <- read.delim("raw_foofy_data.csv")
修订后的代码
library(ggplot2)
library(here)
追风的匕首 · activeperl 离线安装包 - CSDN文库 2 周前 |
紧张的电梯 · 镇魂街争议话题解析 - 知乎 1 年前 |
愤怒的菠菜 · 百兆交换机是总共100M还是每个端口100M_百度知道 1 年前 |
豁达的斑马 · 小李子微博成表情包集散地 贝嫂带儿子非洲做慈善-搜狐 1 年前 |