从另一个 .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
现在可能也会这样做。它在计划中,但我有一段时间没有使用它)。
我正在尝试使我当前的项目可重现,因此我正在创建一个主文档(最终是一个 .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
现在可能也会这样做。它在计划中,但我有一段时间没有使用它)。