我想读取R文件或脚本,修改正在读取的外部数据文件的名称,并将修改后的R代码导出到新的R文件或脚本中。除了正在读取的数据文件的名称(以及新R文件的名称)之外,我希望两个R脚本完全相同。
我可以接近,除了我无法弄清楚如何保留我用于可读性和错误减少的空行。
这是正在读取的原始R文件。请注意,此文件中的某些代码是非敏感的,但对我而言则无关紧要。此代码不需要运行。
# apple.pie.all.purpose.flour.arsc.Jun23.2013.r
library(my.library)
aa <- 10 # aa
bb <- c(1:7) # bb
my.data = convert.txt("../applepieallpurposeflour.txt",
group.df = data.frame(recipe =
c("recipe1", "recipe2", "recipe3", "recipe4", "recipe5")),
covariates = c(paste( "temp", seq_along(1:aa), sep="")))
ingredient <- c('all purpose flour')
function(make.pie){ make a pie }
这是我用来读取上述文件的R代码,修改它并导出结果。这个R代码运行并且是唯一需要运行以实现所需结果的代码(除了我不能使新R脚本的格式与原始R脚本的格式完全匹配,即原始R中存在空行)新R脚本中不存在脚本):
setwd('c:/users/mmiller21/simple r programs/')
# define new fruit
new.fruit <- 'peach'
# read flour file for original fruit
flour <- readLines('apple.pie.all.purpose.flour.arsc.Jun23.2013.r')
# create new file name
output.flour <- paste(new.fruit, ".pie.all.purpose.flour.arsc.Jun23.2013.r", sep="")
# add new file name
flour.a <- gsub("# apple.pie.all.purpose.flour.arsc.Jun23.2013.r",
paste("# ", output.flour, sep=""), flour)
# add line to read new data file
cat(file = output.flour,
gsub( "my.data = convert.txt\\(\"../applepieallpurposeflour.txt",
paste("my.data = convert.txt\\(\"../", new.fruit, "pieallpurposeflour.txt",
sep=""), flour.a),
sep=c("","\n"), fill = TRUE
)
以下是生成的新R脚本:
# peach.pie.all.purpose.flour.arsc.Jun23.2013.r
library(my.library)
aa <- 10 # aa
bb <- c(1:7) # bb
my.data = convert.txt("../peachpieallpurposeflour.txt",
group.df = data.frame(recipe =
c("recipe1", "recipe2", "recipe3", "recipe4", "recipe5")),
covariates = c(paste( "temp", seq_along(1:aa), sep="")))
ingredient <- c('all purpose flour')
function(make.pie){ make a pie }
新创建的R文件中有一个空行,但如何插入原始R脚本中存在的所有空行?谢谢你的任何建议。
编辑:我似乎无法复制StackOverflow上的空白行。它们似乎会被自动删除。 StackOverflow甚至删除我正在使用的缩进,我似乎无法替换它。为此表示歉意。当手头的问题特别是关于格式化时,自动删除空行和缩进是有问题的。我似乎无法修复帖子以在我的脚本中格式化显示R代码。但是,当我正在积极编辑帖子时,代码会正确显示。
编辑:2013年6月27日:原始R文件的代码和中间R文件的代码中的空行和缩进的删除似乎与我的笔记本电脑而不是StackOverflow相关联。当我在办公室桌面上查看此帖子和我的答案时,格式是正确的。当我用笔记本电脑查看这篇文章和我的答案时,空行和缩进都消失了。也许我的笔记本电脑显示器出现故障抱歉最初假设问题出在StackOverflow上。
答案 0 :(得分:1)
这是一个函数,它将为两个变量的每个组合创建一个新的R文件。对不起,下面的代码格式不是更好。代码确实运行并且按预期工作(假设原始R文件的名称以“.arsc.Jun26.2013.r”结尾,而不是在原始帖子中使用的“.arsc.Jun23.2013.r”):
setwd('c:/users/mmiller21/simple r programs/')
# define fruits of interest
fruits <- c('apple', 'pumpkin', 'pecan')
# define ingredients of interest
ingredients <- c('all.purpose.flour', 'sugar', 'ground.cinnamon')
# define every combination of fruit and ingredient
fruits.and.ingredients <- expand.grid(fruits, ingredients)
old.fruit <- as.character(rep('apple', nrow(fruits.and.ingredients)))
old.ingredient <- as.character(rep('all.purpose.flour', nrow(fruits.and.ingredients)))
fruits.and.ingredients2 <- cbind(old.fruit , as.character(fruits.and.ingredients[,1]),
old.ingredient, as.character(fruits.and.ingredients[,2]))
colnames(fruits.and.ingredients2) <- c('old.fruit', 'new.fruit', 'old.ingredient', 'new.ingredient')
# begin function
make.pie <- function(old.fruit, new.fruit, old.ingredient, new.ingredient) {
new.ingredient2 <- gsub('\\.', '', new.ingredient)
old.ingredient2 <- gsub('\\.', '', old.ingredient)
new.ingredient3 <- gsub('\\.', ' ', new.ingredient)
old.ingredient3 <- gsub('\\.', ' ', old.ingredient)
# file name
old.file <- paste(old.fruit, ".pie.", old.ingredient, ".arsc.Jun26.2013.r", sep="")
new.file <- paste(new.fruit, ".pie.", new.ingredient, ".arsc.Jun26.2013.r", sep="")
# read original fruit and original ingredient
flour <- readLines(old.file)
# add new file name
flour.a <- gsub(paste("# ", old.file, sep=""),
paste("# ", new.file, sep=""), flour)
# read new data file
old.data.file <- print(paste("my.data = convert.txt(\"../", old.fruit, "pie", old.ingredient2, ".txt\",", sep=""), quote=FALSE)
new.data.file <- print(paste("my.data = convert.txt(\"../", new.fruit, "pie", new.ingredient2, ".txt\",", sep=""), quote=FALSE)
flour.b <- ifelse(flour.a == old.data.file, new.data.file, flour.a)
flour.c <- ifelse(flour.b == paste('ingredient <- c(\'', old.ingredient3, '\')', sep=""),
paste('ingredient <- c(\'', new.ingredient3, '\')', sep=""), flour.b)
cat(flour.c, file = new.file, sep=c("\n"))
}
apply(fruits.and.ingredients2, 1, function(x) make.pie(x[1], x[2], x[3], x[4]))
答案 1 :(得分:0)
这是一个重现原始R脚本的解决方案(除了两个所需的更改),同时还保留了新R脚本中原始R脚本的格式。
setwd('c:/users/mmiller21/simple r programs/')
new.fruit <- 'peach'
flour <- readLines('apple.pie.all.purpose.flour.arsc.Jun23.2013.r')
output.flour <- paste(new.fruit, ".pie.all.purpose.flour.arsc.Jun23.2013.r", sep="")
flour.a <- gsub("# apple.pie.all.purpose.flour.arsc.Jun23.2013.r",
paste("# ", output.flour, sep=""), flour)
flour.b <- gsub( "my.data = convert.txt\\(\"../applepieallpurposeflour.txt",
paste("my.data = convert.txt\\(\"../", new.fruit, "pieallpurposeflour.txt", sep=""), flour.a)
for(i in 1:length(flour.b)) {
if(i == 1) cat(flour.b[i], file = output.flour, sep=c("\n"), fill=TRUE )
if(i > 1) cat(flour.b[i], file = output.flour, sep=c("\n"), fill=TRUE, append = TRUE)
}
再次,我为无法以可读的方式格式化上述R代码而道歉。我从来没有在StackOverflow上遇到过这个问题,也不知道解决方案。无论如何,上面的R脚本解决了我在原帖中描述的问题。
要查看原始R脚本的格式,您必须单击原始帖子下的编辑按钮。
编辑:2013年6月25日
我不知道昨天我的做法有多么不同,但今天我发现以下简单的cat
语句代替上面的for-loop
创建了新的R
脚本同时保留原始R
脚本的格式。
cat(flour.b, file = output.flour, sep=c("\n"))