2014-10-07 2 views
5

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

Возможно ли определить regions или что-нибудь подобное в файле, а затем выполнить его из другого файла?

Любая помощь будет высоко оценена.

+0

Кажется, вы должны писать R-функции и строительные пакеты. –

ответ

10

Если вы обеспокоены область интереса будет смещаться после добавления новых линий вверх по течению, то альтернативы (или несколько модифицированная) версия ответа MrFlick была бы читаться как:

sourcePartial <- function(fn,startTag='#from here',endTag='#to here') { 
    lines <- scan(fn, what=character(), sep="\n", quiet=TRUE) 
    st<-grep(startTag,lines) 
    en<-grep(endTag,lines) 
    tc <- textConnection(lines[(st+1):(en-1)]) 
    source(tc) 
    close(tc) 
} 

Теперь вам нужно поставить небольшой, уникальный хэш-тег чуть выше и ниже области интереса. Например, «# from here» и «#to here»

+0

Честное слово, я только прочитал ваш ответ после того, как отправил свой комментарий. –

+0

Это работает отлично, именно то, что я искал, большое спасибо. – Patthebug

3

Это не похоже на супербезопасную идею, учитывая, как легко менять номера строк во время редактирования. Похоже, было бы безопаснее разделить ваш более крупный файл на более мелкие части, которые безопаснее включать и запускать. Но вы могли бы сделать что-то вроде этого

sourcePartial <- function(fn, skip=0, n=-1) { 
    lines <- scan(fn, what=character(), sep="\n", skip=skip, n=n, quiet=TRUE) 
    tc <- textConnection(lines) 
    source(tc) 
    close(tc) 
} 

здесь мы используем scan() для чтения строк из файла. См. Документацию для skip= и n= по адресу ?scan, чтобы узнать, как пропустить определенное количество строк и прекратить чтение после определенного номера. Так

sourcePartial("test.R", 4, 11) 

будет работать строки 5-15 из «test.r»

+0

Я предполагаю, что вы могли бы написать что-то более общее, если бы плакат был готов разбить исходный файл на разделы с общим (комментированным) заголовком заголовка, например '#header: Region_4', вы могли бы прочитать за один проход, чтобы найти линии с заголовками, а затем выберите целевой раздел на основе имени или порядкового номера. –

+0

спасибо за ваш ответ, я думаю, что обобщенная версия еще лучше. – Patthebug

+0

Ну, если это то, что вы хотели, было бы лучше описать это в исходном вопросе. Другая версия делает еще больше предположений о содержимом файла. – MrFlick

Смежные вопросы