Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的函数中保存Stata文件_R_Function_Save_Stata - Fatal编程技术网

在R中的函数中保存Stata文件

在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

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


它只复制第一个文件。当我尝试通过打印函数中的各种术语(例如,将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.files
file.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)