我正在尝试使我当前的项目可重现,因此我创建了一个主文档(最终是一个.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
答案 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
以相同的方式调用它。