-1

R ファイルまたはスクリプトを読み取り、読み取られている外部データ ファイルの名前を変更し、変更された R コードを新しい R ファイルまたはスクリプトにエクスポートしたいと考えています。読み取られるデータ ファイルの名前 (および新しい R ファイルの名前) 以外は、2 つの 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 ファイルには空白行が 1 行ありますが、元の R スクリプトに存在するすべての空白行を挿入するにはどうすればよいですか? アドバイスありがとうございます。

編集: ここで StackOverflow で空白行を複製することはできないようです。それらは自動的に削除されるようです。StackOverflow は、私が使用しているインデントを削除していて、それを置き換えることができないようです。これにつきましては申し訳ございません。空白行とインデントの自動削除は、目前の問題が特にフォーマットに関するものである場合に問題があります。スクリプトでフォーマットされたRコードを表示するように投稿を修正できないようです。ただし、投稿を積極的に編集している場合、コードは正しく表示されます。

編集: 2013 年 6 月 27 日: 元の R ファイルのコードと中間の R ファイルのコードでの空の行とインデントの削除は、StackOverflow ではなく私のラップトップに関連付けられているようです。この投稿と回答をオフィスのデスクトップで表示すると、形式は正しいです。この投稿と回答をラップトップで表示すると、空の行とインデントがなくなります。ラップトップのモニターが故障している可能性があります。問題が StackOverflow にあると最初に想定して申し訳ありません。

4

2 に答える 2

1

以下は、2 つの変数の組み合わせごとに新しい R ファイルを作成する関数です。申し訳ありませんが、以下のコードのフォーマットは良くありません。コードは実行され、意図したとおりに機能します (元の R ファイルの名前が、元の投稿で使用されている ".arsc.Jun23.2013.r" ではなく、".arsc.Jun26.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 スクリプトを (必要な 2 つの変更を除いて) 再現し、新しい R スクリプトで元の R スクリプトの書式設定を維持する 1 つのソリューションを次に示します。

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-loopRR

cat(flour.b, file = output.flour, sep=c("\n"))
于 2013-06-25T07:07:21.367 に答える