경로를 연결하는 기능?
경로를 연결하는 기존 기능이 있습니까?
나는 그것을 구현하기 어려운 아니라는 것을 알고,하지만 여전히 ... 후행 처리 복용 외에 /
(또는 \
) 나는 (우리가 쓰기 여부, 즉 적절한 OS 경로 형식 감지 돌볼 필요가 C:\dir\file
또는 /dir/file
).
내가 말했듯이 나는 그것을 구현하는 방법을 알고 있다고 믿습니다. 문제는 내가해야할까요? 기능이 기존 R 패키지에 이미 존재합니까?
예, file.path()
R> file.path("usr", "local", "lib")
[1] "usr/local/lib"
R>
system.path()
패키지의 파일 에도 똑같이 유용한 것이 있습니다 .
R> system.file("extdata", "date_time_zonespec.csv", package="RcppBDT")
[1] "/usr/local/lib/R/site-library/RcppBDT/extdata/date_time_zonespec.csv"
R>
extdata/date_time_zonespec.csv
상관없이 파일을 얻을 것 입니다
- 패키지가 설치된 위치 및
- OS
매우 편리합니다. 마지막으로
R> .Platform$file.sep
[1] "/"
R>
당신이 그것을 수동으로 고집한다면.
누군가가 원하는 경우 이것은 내 자신의 기능 path.cat
입니다. 그 기능은 os.path.join
추가 설탕이있는 Python의 ..
.
이 함수를 사용하면 경로를 계층 적으로 구성 할 수 있지만과 달리 file.path
사용자는 절대 경로를 입력하여 계층을 재정의 할 수 있습니다. 그리고 설탕을 첨가하여 경로에서 원하는 곳에 ".."를 넣을 수 있습니다.
예 :
path.cat("/home/user1","project/data","../data2")
소리 치다/home/user1/project/data2
path.cat("/home/user1","project/data","/home/user2/data")
소리 치다/home/user2/data
이 함수는 슬래시를 경로 구분 기호로 사용하는 경우에만 작동합니다. R은 Windows 시스템에서이를 백 슬래시로 투명하게 변환하므로 괜찮습니다.
library("iterators") # After writing this function I've learned, that iterators are very inefficient in R.
library("itertools")
#High-level function that inteligentely concatenates paths given in arguments
#The user interface is the same as for file.path, with the exception that it understands the path ".."
#and it can identify relative and absolute paths.
#Absolute paths starts comply with "^\/" or "^\d:\/" regexp.
#The concatenation starts from the last absolute path in arguments, or the first, if no absolute paths are given.
path.cat<-function(...)
{
elems<-list(...)
elems<-as.character(elems)
elems<-elems[elems!='' && !is.null(elems)]
relems<-rev(elems)
starts<-grep('^[/\\]',relems)[1]
if (!is.na(starts) && !is.null(starts))
{
relems<-relems[1:starts]
}
starts<-grep(':',relems,fixed=TRUE)
if (length(starts)==0){
starts=length(elems)-length(relems)+1
}else{
starts=length(elems)-starts[[1]]+1}
elems<-elems[starts:length(elems)]
path<-do.call(file.path,as.list(elems))
elems<-strsplit(path,'[/\\]',FALSE)[[1]]
it<-ihasNext(iter(elems))
out<-rep(NA,length(elems))
i<-1
while(hasNext(it))
{
item<-nextElem(it)
if(item=='..')
{
i<-i-1
} else if (item=='' & i!=1) {
#nothing
} else {
out[i]<-item
i<-i+1
}
}
do.call(file.path,as.list(out[1:i-1]))
}
참조 URL : https://stackoverflow.com/questions/13110076/function-to-concatenate-paths
'programing' 카테고리의 다른 글
초기화 목록과 함께 std :: array 사용 (0) | 2021.01.14 |
---|---|
Javascript removeEventListener가 작동하지 않습니다. (0) | 2021.01.14 |
부정의 인스턴스 (0) | 2021.01.14 |
기수 정렬 대 계수 정렬 대 버킷 정렬. (0) | 2021.01.14 |
클래스에서 다른 메서드를 호출하는 방법은 무엇입니까? (0) | 2021.01.14 |