2015-06-16 3 views
4

Я пытаюсь воспроизвести данный текущий проект, и поэтому создаю мастер-документ (в конечном итоге файл .rmd), который будет использоваться для вызова и выполнения нескольких других документов. Таким образом, я и другие исследователи должны только открыть и запустить один файл.Редактирование .r файла из другого .r-файла

Существует три слоя для текущей настройки: главный файл, 2 файла для чтения, 2 базы данных. Главный файл вызывает файлы read-in с использованием source(), а файлы read-in анализируют базы данных .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 

[читать -в код усеченные]

Дополнительная информация:
ОС: Windows 7 Professional x86
версияR: 3.1.3
R Studio Версия: 0.99.441

+0

Возможно, было бы хорошо указать, что это хорошая причина не иметь 'rm (list = ls())' в файле сценария. Я не уверен, что вы пытаетесь предотвратить. Вы можете отправлять исходные файлы в среду, отличную от среды по умолчанию, если вы действительно хотели использовать 'local =' или 'sys.source()' – MrFlick

+0

. Я определенно согласен, но в этом случае звучит так: ошибка REDCap в данных по умолчанию -through-script процесс экспорта ... Кажется, что OP не имеет никакого контроля над этим, хотя может иметь возможность экспортировать данные через какой-либо другой формат и глотать данные непосредственно в R, а не по сценарию R. Я так не могу сказать это? –

+0

Верно, Форрест. Я могу либо экспортировать его «для использования в R», который генерирует вышеупомянутые файлы для чтения, либо просто экспортирует его как csv и самостоятельно записывает файл для чтения. Проблема в том, что у меня почти 2000 переменных, поэтому это не реально. Отсюда моя головоломка. –

ответ

1

Вы могли бы попробовать это. Он просто вызывает некоторые команды оболочки: (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.

+0

Это сработало, спасибо! Кажется, мне нужно немного ознакомиться с командами оболочки. Любят, как он обрабатывает оба файла для чтения за один шаг. Спасибо за помощь! –

+0

Также, как это гибко с помощью findstr. Настолько полезно. –

+0

@CarolynClayton Рад, что это помогло! Он удалит все строки с этой строкой - если вы сделаете более общую строку. – jenesaisquoi

4

Вы можете попробовать 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 Уи-х:

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") 
+0

Это сработало, спасибо! Хотя я еще не понял, как тестировать тайминги, я думаю, что это может занять немного медленнее, чем ответ LegalizeIt, поскольку он for-loops через тысячи строк кода, но это простое и понятное решение, и я сохраню его и, скорее всего, реализует его в будущем. Большое вам спасибо за помощь! –

+0

Я не знал, что скорость здесь была проблемой, но если это так, то вы должны использовать мой второй вариант выше. –

+2

Обратите внимание, что на самом деле вам не нужен явный цикл цикла или отдельная запись. Это также работает: 'eval (parse (readLines (" read-in1.R ") [- 2]))' –

2

Извините, что я так поздно замечу этот вопрос, но вы можете изучить доступ к API REDCap и использовать либо пакет redcapAPI, либо пакет REDCapR. Оба этих пакета позволят вам экспортировать данные из REDCap и непосредственно в R без использования сценариев загрузки. redcapAPI даже применит все форматы и даты (REDCapR может сделать это сейчас тоже. Это было в плане, но я не использовал его в то время).

+0

Я даже не думал об этом. Спасибо за совет! –