4

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

4

3 回答 3

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")
于 2015-06-16T23:46:16.983 回答
2

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

于 2015-07-13T17:11:42.873 回答
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

于 2015-06-17T00:43:51.670 回答