Изменить приглашение по умолчанию и префикс выходной строки в R? - PullRequest
21 голосов
/ 19 сентября 2009

В целях обучения и подготовки письменных инструкций о R одна из вещей, которые меня всегда расстраивают, заключается в том, что я не могу просто скопировать команды и вывод из R и вставить их в другой сеанс R. Например, если я сделаю что-нибудь тривиальное, например,

> x <- rnorm(10)
> x
 [1]  1.76975998  1.19722850 -0.39274507 -1.10979974  0.52320473 -0.08643833
 [7]  0.94437690  0.08083207  0.62260363  1.89305469

Если я скопирую и вставлю это в документ или даже здесь, в этом посте, вы (и мои студенты) не сможете просто выделить его, скопировать и вставить в сеанс R успешно

> > x <- rnorm(10)
Error: syntax error
> > x
Error: syntax error
>  [1]  1.76975998  1.19722850 -0.39274507 -1.10979974  0.52320473 -0.08643833
Error: syntax error
>  [7]  0.94437690  0.08083207  0.62260363  1.89305469
Error: syntax error

Возможно, вы захотите сделать это, чтобы проверить вашу установку R, сравнить мой вывод с вашим или просто использовать функцию, которую я предложил.

Итак, я хотел бы изменить стандартное приглашение с> на пустую строку или пробел, а также поставить перед всеми выходными строками хеш-знак #. Таким образом, я мог бы использовать R в интерактивном режиме для генерации сеанса, который выглядит как

x <- rnorm(10)
x
# [1]  1.76975998  1.19722850 -0.39274507 -1.10979974  0.52320473 -0.08643833
# [7]  0.94437690  0.08083207  0.62260363  1.89305469

который может быть успешно скопирован / вставлен в R-сеанс. Это сделало бы подготовку кода R для статьи в журнале, студентов, лекций и т. Д. Намного проще для меня (а может, и для других?)

Я осмотрел документацию без удачи ... есть идеи? указатели?

В настоящее время я использую R на Mac через графический интерфейс R.app или из терминала.

Ответы [ 10 ]

26 голосов
/ 19 сентября 2009

Вы можете попробовать:

options(prompt=" ", continue=" ")

Обратите внимание на пробелы между кавычками.

При первом выборе подсказка исчезает. Вторая удаляет «+» из длинных строк переноса.

15 голосов
/ 20 сентября 2009

Итак, мне очень нравятся решения Джейка и Марека. Jake's прост, но не решает проблему форматирования вывода. Марек был немного громоздким, поэтому я завернул его в функцию, в результате чего

cleanCode <- function() {
  if (.Platform$OS.type == "unix" && .Platform$pkgType == "mac.binary") {
    to_edit <- readLines(pipe("pbpaste")) # Mac ONLY solution
  } else {
    to_edit <- readLines("clipboard") # Windows/Unix solution
  }
  opts <- options()
  cmdPrompts <- paste("^", opts$prompt, "|^", opts$continue, sep="")

  # can someone help me here? how to escape the + to \\+, as well as other special chars

  id_commands <- grep("^> |^\\+ ", to_edit) # which are command or continuation lines
  to_edit[id_commands] <- sub("^> |^\\+ ", "", to_edit[id_commands]) # remove prompts
  to_edit[-id_commands] <- paste("  # ", to_edit[-id_commands]) # comment output
  writeLines(to_edit)
}

, который позволяет мне выделить и скопировать часть интерактивного сеанса.

Так, например, я могу использовать это для копирования

> x <- rnorm(20)
> plot(x)
> summary(x)
    Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
-2.34000 -0.86010 -0.21940 -0.43340  0.04383  1.06400 
> str(x)
 num [1:20] -1.568 -0.219 -1.951 1.064 0.768 ...
> sd(x)
[1] 0.8932958

в буфер обмена и простым вызовом

> cleanCode() 

производит вывод, такой как

x <- rnorm(20)
plot(x)
summary(x)
  #      Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
  #  -2.34000 -0.86010 -0.21940 -0.43340  0.04383  1.06400 
str(x)
  #   num [1:20] -1.568 -0.219 -1.951 1.064 0.768 ...
sd(x)
  #  [1] 0.8932958

который кто-то может быстро выделить и скопировать и вставить в сеанс R, чтобы выполнить код и сравнить свои результаты Конечно, в этом случае они получат разные результаты, поскольку я основываю пример на случайных данных.

Спасибо, Джейк, Марек и все остальные ... все ответы были полезны!

5 голосов
/ 20 сентября 2009

Тяжелым способом является регулярное выражение исходного вывода. Предположим, у вас есть код:

x <- rnorm(10)
  x

head(USArrests)

lm(y~x+z,
    data.frame(y=rnorm(10),z=runif(10),x=rbinom(10,2,.5))
)

Вы можете сохранить его в файл и затем использовать readLines для чтения в переменную. Я делаю то же самое, используя textConnection на скопированный вывод:

to_edit <- readLines(textConnection("
> x <- rnorm(10)
>   x
 [1] -0.43409069 -1.05399275  1.53440218  0.05812936  1.62713995 -1.20644184
 [7] -0.15698798 -2.36494897 -0.14440292  1.47182117
> 
> head(USArrests)
           Murder Assault UrbanPop Rape
Alabama      13.2     236       58 21.2
Alaska       10.0     263       48 44.5
Arizona       8.1     294       80 31.0
Arkansas      8.8     190       50 19.5
California    9.0     276       91 40.6
Colorado      7.9     204       78 38.7
> 
> lm(y~x+z,
+ data.frame(y=rnorm(10),z=runif(10),x=rbinom(10,2,.5))
+ )

Call:
lm(formula = y ~ x + z, data = data.frame(y = rnorm(10), z = runif(10),     x = rbinom(10, 2, 0.5)))

Coefficients:
(Intercept)            x            z  
    -0.6460       0.3678       0.3918  
"))

Теперь некоторые правки:

id_commands <- grep("^> |^\\+ ",to_edit) # which are commands or its continuity
to_edit[id_commands] <- sub("^> |^\\+ ","",to_edit[id_commands]) # remove promt
to_edit[-id_commands] <- paste("#",to_edit[-id_commands]) # comment output

И результат:

> writeLines(to_edit) # you can specify file or write on screen
# 
x <- rnorm(10)
  x
#  [1] -0.43409069 -1.05399275  1.53440218  0.05812936  1.62713995 -1.20644184
#  [7] -0.15698798 -2.36494897 -0.14440292  1.47182117

head(USArrests)
#            Murder Assault UrbanPop Rape
# Alabama      13.2     236       58 21.2
# Alaska       10.0     263       48 44.5
# Arizona       8.1     294       80 31.0
# Arkansas      8.8     190       50 19.5
# California    9.0     276       91 40.6
# Colorado      7.9     204       78 38.7

lm(y~x+z,
data.frame(y=rnorm(10),z=runif(10),x=rbinom(10,2,.5))
)
# 
# Call:
# lm(formula = y ~ x + z, data = data.frame(y = rnorm(10), z = runif(10),     x = rbinom(10, 2, 0.5)))
# 
# Coefficients:
# (Intercept)            x            z  
#     -0.6460       0.3678       0.3918  
# 

Это работает, но, как я уже сказал, это больно.

5 голосов
/ 19 сентября 2009

Что касается изменения приглашения, вам нужна команда options с аргументом prompt, которую я нашел здесь .

> options(prompt = "# Customized R Prompt!\n")
# Customized R Prompt!
1 + 5
[1] 6
# Customized R Prompt!

Установка приглашения для пустой строки приводит к:

> options(prompt="")
Error in options(prompt = "") : invalid value for 'prompt'

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

Я все еще немного разбираюсь в формате вывода ... Есть код в этом сообщении списка рассылки , который, кажется, форматирует вывод без блоков [#], но точно не красивый.

3 голосов
/ 19 сентября 2009

У меня есть два других предложения:

1) Вы можете написать свой код в файле скрипта; тогда вы можете скопировать и вставить код без каких-либо проблем.

В стандартном графическом интерфейсе R выберите «Файл»> «Новый скрипт». Введите весь свой код там, затем, чтобы запустить его, просто выделите код и нажмите CTRL-R. Многие другие R GUI имеют похожее поведение. Вы все еще можете работать в интерактивном режиме в этом режиме; ключевое отличие в том, что вы выделяете код и запускаете его, а не нажимаете ENTER.

2) Используйте функции history(). Смотрите помощь: история. Вы можете сохранить историю консоли с помощью этого:

savehistory(file = ".Rhistory")

Затем вы можете открыть его как файл сценария с помощью этой команды:

edit(file=".Rhistory")

Вы также можете изменить max.show, возможно, даже как значение по умолчанию в вашем .Rprofile. Например,

history(max.show = Inf, reverse = FALSE)

2 голосов
/ 02 января 2019

Очень поздно придя в игру, просто отметив, что в подсказку можно ввести почти все, что угодно Уважение к приглашению многих программистов Unix:

options(prompt = paste0(getwd(),'\n> '))

Вероятно, способ добавить туда цвета.

1 голос
/ 29 октября 2013

Это довольно старый файл, но вы также можете написать свой документ, используя пакет knitr . Это создает вывод, который вы можете просто скопировать / вставить в сеанс R.

1 голос
/ 20 сентября 2009

Недавнее обсуждение было в списке рассылки r-help с несколькими примерами функций, позволяющих убрать> вставленный код для имитации команды «Вставить только команды» графического интерфейса Windows R.

1 голос
/ 19 сентября 2009

Не уверен, поддерживается ли это на всех платформах, но в Windows вы можете скопировать, затем щелкнуть правой кнопкой мыши и выбрать «Вставить только команды», что делает именно то, что вам нужно. К сожалению, нет сочетания клавиш.

1 голос
/ 19 сентября 2009

Вы пишете, что

одна из вещей, которая всегда разочаровал меня в том, что я не могу просто копировать команды и выводить из R и вставьте их в другой сеанс R.

и я полагаю, что вы работаете в Windows со стандартным двоичным файлом R Windows. Я боюсь, что то, что ты имеешь в виду, может быть просто невыполнимым. Но потому что то, что вы хотите сделать, на самом деле очень желательно, люди поступили по-другому. Из руководства ESS :

5 Управление сохраненными файлами стенограммы

Нижний режим S записывает стенограмму (список всех выполненных команд, и их вывод) в процессе буфер, который можно сохранить как «файл расшифровки», который должен обычно имеет суффикс `.St '. наиболее очевидное использование для файла расшифровки как статическая запись действий вы выступали в определенном S сессия. Иногда, однако, вы можете хотите повторно выполнить записанные команды в файле стенограммы, отправив их запущенному процессу ESS. это для чего предназначен режим расшифровки.

Если вы загружаете файл с суффиксом `.St 'в Emacs, он находится в S Режим расшифровки. [...]

Однако переход на Emacs / ESS может быть несовместим с вашими учениками. Поэтому для непосредственного копирования и вставки лучше всего ставить сначала выражения dput():

R> set.seed(42)
R> x <- rnorm(10)
R> x
 [1]  1.37096 -0.56470  0.36313  0.63286  0.40427 -0.10612  1.51152 -0.09466  2.01842 -0.06271
R> dput(x)
c(1.37095844714667, -0.564698171396089, 0.363128411337339, 0.63286260496104, 
0.404268323140999, -0.106124516091484, 1.51152199743894, -0.0946590384130976, 
2.01842371387704, -0.062714099052421)
R> 

Последнее выражение можно вырезать и вставить обратно в R.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...