从另一个.r文件

时间:2015-06-16 23:18:21

标签: r

我正在尝试使我当前的项目可重现,因此我创建了一个主文档(最终是一个.rmd文件),用于调用和执行其他几个文档。这样我自己和其他调查人员只需要打开并运行一个文件。

当前设置有三个层:主文件,2个读入文件,2个数据库。主文件使用source()调用读入文件,读入文件解析.csv数据库并应用标签。

每次下载更新的数据时,使用我当前正在使用的数据管理软件(REDCAP)自动生成读入文件和数据库。

但是,读入文件有一行代码可以删除环境中的所有对象。我想直接从主文件编辑读入文件,这样我每次运行报表时都不必单独打开读取文件。具体来说,由于所有读入的文件都是相同的,我想删除每行中的第2行。

我已尝试搜索Google,并尝试过file.edit(),但一直找不到任何内容。甚至不确定它是否可能,但我想问。如果我可以改进此问题或者您是否需要任何其他代码来回答它,请告诉我。谢谢!

当前相关主码(编制为通用性):

 source("read-in1")  
 source("read-in2")

当前相关的读入文件代码(每个文件中相同,数据库名称除外):

 #Clear existing data and graphics  
 rm(list=ls())  
 graphics.off()  
 #Load Hmisc library  
 library(Hmisc)  
 #Read Data  
 data=read.csv('database.csv')  
 #Setting Labels  

[读入代码截断]

其他细节:
操作系统:Windows 7 Professional x86
R版本:3.1.3
R Studio版本:0.99.441

3 个答案:

答案 0 :(得分:4)

您可以尝试readLines()以及类似下面的内容(下面的@Hong Ooi建议大大简化了这一点):

eval(parse(readLines("read-in1.R")[-2]))

我原来的解决方案更迂腐:

f <- file("read-in1.R", open="r")
t <- readLines(f)
close(f)

for (l in t[-2]) { eval(parse(text=l)) }

for()循环只解析和评估文本文件中的每一行,除了第二行(这是-2索引值的作用)。如果您正在阅读和编写更长的文件,那么以下内容将比第二个选项快得多,但仍然不如@Hong Ooi的优先选择:

f <- file("read-in1.R", open="r")
t <- readLines(f)
close(f)

f <- file("out.R", open="w")
o <- writeLines(t[-2], f)
close(f)
source("out.R")

答案 1 :(得分:2)

很抱歉,我注意到这个问题的时间已经很晚了,但您可能需要调查是否可以访问REDCap API并使用redcapAPI包或REDCapR包。这两个软件包都允许您从REDCap导出数据并直接导入R而无需使用下载脚本。 redcapAPI甚至会应用所有格式和日期(REDCapR现在也可能会执行此操作。这是在计划中,但我暂时没有使用它。)

答案 2 :(得分:1)

你可以试试这个。它只调用一些shell命令:(1)重命名文件,然后(2)将不包含rm(list = ls())的所有行复制到与原始文件同名的新文件,然后(3)删除副本。

files_to_change <- c("read-in1.R", "read-in2.R")
for (f in files_to_change) {
    old <- paste0(f, ".old")
    system(paste("cmd.exe /c ren", f, old))
    system(paste("cmd.exe /c findstr /v rm(list=ls())", old, ">", f))
    system(paste("cmd.exe /c rm", old))
}

调用此循环后,您应该

#Clear existing data and graphics  
graphics.off()  
#Load Hmisc library  
library(Hmisc)  
#Read Data  
data=read.csv('database.csv')  
#Setting Labels  
在您的读入* .R文件中

。您可以将其放在批处理脚本中

@echo off
ren "%~f1" "%~nx1.old"
findstr /v "rm(list=ls())" "%~f1.old" > "%~f1"
rm "%~nx1.old"

说,“example.bat”,并使用system以相同的方式调用它。