-1

我想读取 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 上。

4

2 回答 2

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]))
于 2013-06-26T10:31:25.067 回答
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"))
于 2013-06-25T07:07:21.367 回答