programing

경로를 연결하는 기능?

coolbiz 2021. 1. 14. 23:00
반응형

경로를 연결하는 기능?


경로를 연결하는 기존 기능이 있습니까?

나는 그것을 구현하기 어려운 아니라는 것을 알고,하지만 여전히 ... 후행 처리 복용 외에 /(또는 \) 나는 (우리가 쓰기 여부, 즉 적절한 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상관없이 파일을 얻을 것 입니다

  1. 패키지가 설치된 위치 및
  2. 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

반응형