我正在尝试将文件从一个文件夹移动到另一个文件夹。我有一个名为“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)作为函数的最后一行),它会打印数据中列出的每个文件,表明该函数正在为每一行运行数据,但它实际上并不复制第一个以外的文件。我怎么能纠正这个?
答案 0 :(得分: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 :(得分: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)
}
答案 2 :(得分: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"