4

我正在尝试将文件从一个文件夹移动到另一个文件夹。我有一个名为“data”的数据框,其中包含“from”位置、“to”位置和文件名“myfile”。

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) 作为函数的最后一行),它会为 data 中列出的每个文件打印,表明该函数正在为中的每一行运行数据,但它实际上并没有复制第一个文件之外的文件。我该如何纠正?

4

3 回答 3

8

除非您确实需要将文件作为data.frameusing读入内存,否则read.dta我建议使用 using 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)
于 2013-07-17T01:37:32.767 回答
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)
}
于 2013-07-17T01:25:59.077 回答
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"
于 2013-07-17T01:19:50.293 回答