在R中的函数中保存Stata文件
我正在尝试将文件从一个文件夹移动到另一个文件夹。我有一个名为“data”的数据框,其中包含“from”位置、“to”位置和文件名“myfile”在R中的函数中保存Stata文件,r,function,save,stata,R,Function,Save,Stata,我正在尝试将文件从一个文件夹移动到另一个文件夹。我有一个名为“data”的数据框,其中包含“from”位置、“to”位置和文件名“myfile” 它只复制第一个文件。当我尝试通过打印函数中的各种术语(例如,将print(copyto)添加为函数的最后一行)来诊断问题时,它会打印数据中列出的每个文件,表明函数正在为数据中的每一行运行,但实际上不会复制第一行以外的文件。如何更正此问题?您可以使用mapply例如: mapply(movefile,data$from, data$to, data$my
它只复制第一个文件。当我尝试通过打印函数中的各种术语(例如,将print(copyto)添加为函数的最后一行)来诊断问题时,它会打印数据中列出的每个文件,表明函数正在为数据中的每一行运行,但实际上不会复制第一行以外的文件。如何更正此问题?您可以使用
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"
data问题在于write.dta
没有矢量化,因此您的函数也没有矢量化。您可以使用@agstudy注释的mapply
对movefile
调用进行向量化,也可以对movefile
本身进行向量化。要了解的一个函数是矢量化
,这是一种对任何函数进行矢量化的简单方法
movefile <- Vectorize(movefile)
除非您确实需要使用read.dta
将文件作为data.frame
读入内存,否则我建议使用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)
original.filesfile.path
不是path.file
(除非您使用的是另一个软件包)哎呀,修好了。谢谢。为什么不直接使用file.rename来移动文件而不是读写?
movefile <- Vectorize(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)
}
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)