Подтвердить что ты не робот

Измените приглашение по умолчанию и префикс строки вывода в R?

В целях обучения и подготовки письменных инструкций о 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 либо через GUI R.app, либо из терминала.

4b9b3361

Ответ 1

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

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 для выполнения кода и сравнить их вывод. Конечно, в этом случае они получат разные результаты, так как я основываю пример на случайных данных.

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

Ответ 2

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

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

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

В первом варианте запрос исчезнет. Второй стирает "+" от появления на длинных линиях обертывания.

Ответ 3

Что касается изменения приглашения, команда, которую вы ищете, это 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 нет блочных комментариев, поэтому я сделал запрос комментария строки и поместил новую строку в конце ее - не должно быть проблем, если кто-то копирует ваш сеанс таким образом.

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

Ответ 4

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

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

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

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

Из стандартного R GUI перейдите Файл > Создать Script. Введите весь свой код, затем запустите его, просто выделите код и нажмите CTRL-R. У многих других R GUI наблюдается сходное поведение. Вы можете работать в этом режиме в интерактивном режиме; главное отличие заключается в том, что вы выделяете код и запускаете его, а не нажимаете ENTER.

2) Используйте функции history(). См. Справку:? History. Историю консоли можно сохранить следующим образом:

savehistory(file = ".Rhistory")

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

edit(file=".Rhistory")

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

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

Ответ 6

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

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

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

5 Манипуляция сохраненными файлами расшифровки

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

Если вы загрузите файл a с суффиксом `.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.

Ответ 7

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

Ответ 9

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