2013-07-17 103 views
4

我正試圖將文件從一個文件夾移動到另一個文件夾。我有一個名爲「data」的數據框,其中「from」位置,「to」位置和文件名「myfile」。在函數R中保存Stata文件

library(foreign) 


movefile <- function(from, to, myfile){ 
    readfile <- paste(from, myfile, sep = "/") 
    temp <- read.dta(readfile) 
    copyto <- paste(to, myfile, sep = "/") 
    write.dta(temp, copyto) 
} 

當我打電話與下面的代碼行的功能:

movefile(data$from, data$to, data$myfile) 

,只在第一個文件副本。當我通過在函數中打印各種術語(例如,將print(copyto)作爲函數的最後一行)來嘗試診斷問題時,它會針對數據中列出的每個文件進行打印,表明該函數正在針對數據,但它實際上並沒有將文件複製到第一個文件之外。我該如何解決這個問題?

+0

爲什麼不直接使用file.rename來移動文件而不是讀寫? – Hansi

回答

8

,除非你真的需要將文件讀入內存爲data.frame使用read.dta,我會建議使用file.copy,這將複製使用計算機文件系統的文件。

original.files <- do.call('file.path', data[c('from','myfile')]) 
new.files <- do.call('file.path', data[c('to','myfile')]) 

# overwrite will overwrite, so make sure you mean to do this 
file.copy(from = original.files, to = new.files, overwrite = TRUE) 
+1

+1爲了解決問題的核心。 – thelatemail

3

可以使用mapply例如:

mapply(movefile,data$from, data$to, data$myfile) 

例如,在一個簡化版本的movefile測試此:

data <- data.frame(from=1:2,to=2:3,myfile=c('a','b')) 
movefile <- function(from, to, myfile){ 
    readfile <- paste(from, myfile,to, sep = "/") 
} 
mapply(movefile,data$from, data$to, data$myfile) 

[1] "1/a/2" "2/b/3" 
4

的問題是,write.dta沒有矢量化,因此也不是你的功能。您可以使用mapply作爲標註@agstudy,以便將您的呼叫調整爲movefile,或者使用矢量化movefile本身。需要了解的一個功能是Vectorize,這是一種簡單的矢量化任何功能的方法。

movefile <- Vectorize(movefile) 

這適用於一般情況,但可能不是最高效或透明的方法。您也可以重寫movefile進行內部矢量化:

movefile <- function(from, to, myfile) 
{ 
    readfile <- file.path(from, myfile) 
    copyto <- file.path(to, myfile) 
    mapply(function(f1, f2) write.dta(read.dta(f1), f2), readfile, copyto) 
} 
+0

'file.path'不是'path.file'(除非你使用另一個包) – mnel

+0

哎呀,修正了。謝謝。 –