2013-06-25 4 views
-1

Я хочу прочитать R-файл или скрипт, изменить имя файла внешних данных, который будет прочитан, и экспортировать измененный R-код в новый R-файл или скрипт. Помимо имени считываемого файла данных (и имени нового R-файла), я хочу, чтобы два R-скрипта были идентичными., используя cat в 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-скрипте? Спасибо за любой совет.

EDIT: Я не могу дублировать пустые строки здесь, на StackOverflow. Кажется, они удаляются автоматически. StackOverflow даже удаляет отступ, который я использую, и я не могу его заменить. Извини за это. Автоматическое удаление пустых строк и отступов проблематично, когда проблема связана с форматированием. Я не могу исправить сообщение, чтобы отобразить R-код, отформатированный в моем скрипте. Тем не менее, код действительно отображается правильно, когда я активно редактирую сообщение.

EDIT: 27 июня 2013 г. Удаление пустых строк и отступов в коде исходного файла R и в коде для среднего R-файла, похоже, связано с моим ноутбуком, а не с StackOverflow. Когда я просматриваю этот пост и свои ответы на рабочем столе своего офиса, формат верен. Когда я просматриваю этот пост и мои ответы с моим ноутбуком, пустые строки и отступы исчезают. Возможно, мой монитор ноутбука неисправен. Извините, что первоначально предполагалось, что проблема связана с StackOverflow.

+2

Как вы планируете запускать свои окончательные сценарии, такие как 'apple.pie.all.purpose.flour.arsc.Jun23.2013.r'? Я спрашиваю, потому что есть намного лучшие способы подойти к вашей проблеме. Если вы запускаете скрипты из командной строки, вы можете сделать входной файл аргументом (см. 'CommandArgs'). Если вы отправляете свой сценарий с помощью 'source' из R, вы можете просто превратить свой код в функцию, которая принимает имя файла в качестве аргумента. – flodel

+1

Как говорит @flodel, есть много способов справиться с этим, чем текстовое переключение. Я сам поеду на функцию. –

+1

@flodel Сценарий R будет отправлен в кластер или суперкомпьютер. Если я определяю, как создать функцию, которую вы предлагаете, я отправлю ее здесь. Независимо от того, как создаются файлы, моя цель состоит в том, чтобы оба файла R были идентичны, за исключением двух различий, которые я выделил выше. –

ответ

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 вам нужно нажать кнопку редактирования под исходным сообщением.

EDIT: 25 июня 2013

Я не знаю, что я делаю по-другому вчера, но сегодня я обнаружил, что следующее простое cat заявление, вместо for-loop непосредственно над, создает новый R скрипт во время сохраняя форматирование оригинального сценария R.

cat(flour.b, file = output.flour, sep=c("\n")) 
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])) 
Смежные вопросы