从另一个 .r 文件中编辑一个 .r 文件

Editing a .r file from within another .r file

我正在尝试使我当前的项目可重现,因此我正在创建一个主文档(最终是一个 .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  

[读入代码 t运行cated]

其他详细信息:
OS: Windows 7 专业 x86
R 版本:3.1.3
R Studio 版本:0.99.441

您可以尝试 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")

你可以试试这个。它只是调用一些 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.

以同样的方式调用它

抱歉,我这么晚才注意到这个问题,但您可能想调查获取 REDCap API 的访问权限并使用 redcapAPI 包或 REDCapR 包.这两个包都允许您从 REDCap 导出数据并直接导入 R,而无需使用下载脚本。 redcapAPI 甚至会应用所有格式和日期(REDCapR 现在可能也会这样做。它在计划中,但我有一段时间没有使用它)。