2011-04-19 74 views
8

我希望根據任何標準符號來獲取R中文件的全限定名。例如:R中的完全限定文件名

  • file.ext
  • 〜/ file.ext(這種情況下可以通過path.expand處理)
  • ../current_dir/file.ext

完全限定文件名稱,例如,我是說(在類Unix系統上):

/home/user/some/path/file.ext

(編輯 - 使用file.path並嘗試Windows的支持)粗的實現可能是:

path.qualify <- function(path) { 
    path <- path.expand(path) 
    if(!grepl("^/|([A-Z|a-z]:)", path)) path <- file.path(getwd(),path) 
    path 
} 

然而,我'd理想上喜歡跨平臺的東西,可以用../,符號鏈接等方式處理相對路徑。只有R的解決方案將是首選的(而不是shell腳本或類似的),但是我找不到任何直接的方法來做到這一點,編碼「從頭開始」。

任何想法?

回答

10

我想你想要normalizePath()

> setwd("~/tmp/bar") 
> normalizePath("../tmp.R") 
[1] "/home/gavin/tmp/tmp.R" 
> normalizePath("~/tmp/tmp.R") 
[1] "/home/gavin/tmp/tmp.R" 
> normalizePath("./foo.R") 
[1] "/home/gavin/tmp/bar/foo.R" 

對於Windows,有說法winslash它,因爲它是Windows以外的任何東西忽略,以便不會影響到其他的操作系統,你可能需要設置所有的時間:

> normalizePath("./foo.R", winslash="\\") 
[1] "/home/gavin/tmp/bar/foo.R" 

(你需要躲避\因此\\)或

> normalizePath("./foo.R", winslash="/") 
[1] "/home/gavin/tmp/bar/foo.R" 

取決於您希望如何顯示/使用路徑。前者是默認值("\\"),所以如果它足夠,您可以堅持,而不需要明確設置任何內容。

在右2.13.0那麼"~/file.ext"位也可以(見註釋):

> normalizePath("~/foo.R") 
[1] "/home/gavin/foo.R" 
+0

非常好,它甚至取消了引用符號鏈接 - 唯一的問題是它似乎沒有涵蓋'〜/ file.ext'的情況。使用'normalizePath(path.expand(filename))'很容易解釋。非常感謝。 – daveslanted 2011-04-19 17:08:22

+0

@daveslanted它在R 2.13.0中有。看到我更新的答案。你跑哪個版本的R? – 2011-04-19 17:11:04

+0

2.12.2。我可能不得不堅持現在的解決方法而不是升級,但很高興知道它已在最新的穩定版本中得到修復。再次感謝。 – daveslanted 2011-04-19 17:15:29

2

我覺得我有點想念你的問題的地步,但我希望我的回答可以指向你到你想要的方向(它集成了您的使用pastegetwdlist.files的想法):

paste(getwd(),substr(list.files(full.names = TRUE), 2,1000), sep ="") 

編輯:在一些測試過的文件夾中的窗口中工作。

+0

感謝您的答覆,但理想這需要一個任意文件名作爲參數的函數後,我(例如如問題中的項目符號列表中的那些)並返回完全限定的文件名。 – daveslanted 2011-04-19 16:45:28

+0

如果用戶想要傳入'「../ current_dir/file.ext」'作爲要擴展的路徑,這將如何工作? – 2011-04-19 16:51:00

相關問題