2016-10-13 5 views
0

Я хочу записать файл .R или создать R script от R console, как мы создаем файлы .txt. Но обычно, когда мы выписываем файлы .txt, они содержат некоторые output, а не commands. Поэтому я хочу написать R script от console и save с помощью команд R.Запись файла .R из консоли R без использования R или любого редактора с использованием команд R

Я не уверен, что у R есть write.R что-то вроде этого. Я попытался использовать команду sink(), но опять же это outputs the output and not commands.

sink("Rscriptfrom_Console.R") 
sapply(iris,class) 
sink() 

Создание R script file (.R) from R console using R commands.

Любая помощь очень ценится. Спасибо!

+0

Вы можете создать файл, а затем отредактировать его из R консоли, выполнив: 'file.create ('foo.R') file.edit ('foo.R') '. –

+0

Я просто попытался использовать 'writeLines()' и 'file()', похоже, что он работает. Позвольте мне проверить, добавив больше команд и поиска. –

+0

Вот небольшой пример. с помощью 'writelines: fileConn <-file (" foo.R "); writeLines (paste (" sapply ("," iris, "," class) "), fileConn); close (fileConn); source ('foo.R ') ' –

ответ

1

Отвечая на мой собственный вопрос. У вас есть сообщение, если у вас есть лучший ответ. Использование здесь file() и writeLines() и source(), чтобы проверить, работает ли файл .R.

fc <- file("out.R") 

    writeLines(c("print(head(iris))", 
    "print(summary(iris))"), 
    fc) 

    close(fc) 

    source("out.R") 
    # Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
    # 1   5.1   3.5   1.4   0.2 setosa 
    # 2   4.9   3.0   1.4   0.2 setosa 
    # 3   4.7   3.2   1.3   0.2 setosa 
    # 4   4.6   3.1   1.5   0.2 setosa 
    # 5   5.0   3.6   1.4   0.2 setosa 
    # 6   5.4   3.9   1.7   0.4 setosa 

    # Sepal.Length Sepal.Width  Petal.Length Petal.Width 
    # Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 
    # 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 
    # Median :5.800 Median :3.000 Median :4.350 Median :1.300 
    # Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 
    # 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 
    # Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 

    #  Species 
    # setosa :50 
    # versicolor:50 
    # virginica :50 
+0

Я рекомендую вам не использовать 'file' ...' close' здесь: использование имени файла напрямую (см. Мой ответ) намного проще. Использование 'close' и подобных функций обычно подвержено ошибкам: если перед вызовом' close' возникает ошибка, то выполнение останавливается, и 'close' никогда не вызывается. Чтобы смягчить это, вы должны * всегда * использовать ['on.exit'] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/on.exit.html) в таких сценарий. Поэтому в вашем случае удалите 'close (fc)' и вместо этого поместите 'on.exit (close (fc))' непосредственно за ваш вызов на 'файл'. –

+0

Спасибо за предоставленную информацию. Дайте мне время, чтобы проверить на 'on.exit' и реализовать ваш пример. Благодаря! –

0

Кажется, вы поняли, что sink делает: он захватывает выход и записывает его в файл. Он не отображает неоцененные выражения R, которые вы хотите сделать.

Чтобы зафиксировать неоцененное выражение R, его необходимо обернуть внутри quote или использовать аналогичный механизм. Для использования вашего примера:

quoted_expr = quote(sapply(iris, class)) 

В настоящее время quoted_expr содержит выражение R. Далее, вам нужно, чтобы преобразовать его в строковое представление кода R:

code_representation = deparse(quoted_expr, backtick = TRUE) 

backtick = TRUE не является строго необходимым, но здесь это хорошая практика, чтобы всегда использовать его, потому что есть некоторые случаи, когда это необходимо.

Наконец, мы можем записать этот код представления в файл:

writeLines(code_representation, 'code.r') 

Теперь, приведенный выше пример написал выражение фиксированного R в файл. Мы могли бы использовать строку символов повсюду. Но использование цитированного выражения вместо символьной строки дает нам возможность изменять код «на лету», без необходимости обманывать строку (подверженность ошибкам и неэффективность). Например, мы могли бы позволить пользователю решить, какой data.table работать на:

dataset_name = 'mtcars' # Modify to your heart’s content 
quoted_expr = substitute(sapply(dataset, class), 
         list(dataset = as.name(dataset_name))) 

# `quoted_expr` is now: 
sapply(mtcars, class) 

... и т.д.

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