更改R中的默认提示和输出行前缀?

时间:2009-09-19 13:59:38

标签: 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的安装,将我的输出与您的输出进行比较,或者只是使用我提供的功能。

所以,我希望能够做的是从&gt;更改默认提示。到空字符串或空格,并在所有输出行前面加上一个井号#。这样,我可以交互使用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.app GUI或终端在Mac上使用R.

11 个答案:

答案 0 :(得分:26)

您可以尝试:

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

注意引号之间的空格。

第一个选项使提示消失。第二个消除“+”出现在长缠绕线上。

答案 1 :(得分:15)

所以,我非常喜欢Jake和Marek的解决方案。 Jake是直截了当的,但没有解决问题的输出格式化部分。马雷克有点麻烦,所以我把它包裹在一个导致

的函数中
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

有人可以快速突出显示并复制&amp;粘贴到R会话中以执行代码并比较它们的输出。当然,在这种情况下,他们会得到不同的结果,因为我的实例是基于随机数据。

谢谢Jake,Marek和其他所有人......所有回复都很有帮助!

答案 2 :(得分:5)

至于更改提示,您要查找的命令为options,参数prompt,我找到了here

> 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没有块注释,这就是为什么我提示行注释并在其末尾添加换行符 - 如果有人复制,应该 no 问题 - 以这种方式粘贴你的会话。

我仍然在这里查看输出格式... this mailling list post处有一些代码似乎在没有[#]块的情况下格式化输出,但它肯定不漂亮。

答案 3 :(得分:5)

痛苦的方法是regexp原始输出。假设你有一些代码:

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  
# 

它有效,但正如我所说的那样痛苦。

答案 4 :(得分:3)

我还有另外两条建议:

1)您可以在脚本文件中编写代码;然后你可以毫无困难地复制和粘贴代码。

从标准R GUI,转到文件&gt;新脚本。在那里输入您的所有代码,然后运行它,只需突出显示代码并按CTRL-R。许多其他R GUI具有类似的行为。您仍然可以在此模式下以交互方式工作;关键的区别在于你突出显示代码并运行它而不是点击ENTER。

2)使用history()功能。请参阅帮助:?历史记录。您可以使用以下命令保存控制台历史记录:

savehistory(file = ".Rhistory")

然后您可以使用以下命令将其作为脚本文件打开:

edit(file=".Rhistory")

您可能还想更改max.show,甚至可能更改为您自己的.Rprofile中的默认值。例如,

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

答案 5 :(得分:2)

游戏进行得很晚,只是指出几乎所有需要的内容都可以放在提示中。向许多unix程序员的shell提示致敬:

.NET Core

可能也是一种在其中扔颜色的方法。

答案 6 :(得分:1)

你写的那个

  

其中一件事总是如此   让我感到沮丧的是,我不能简单   从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 :(得分:1)

不确定是否所有平台都支持此功能,但在Windows上,您可以复制,然后右键单击并选择“仅粘贴命令”,这正是您所需要的。不幸的是,没有键盘快捷键。

答案 8 :(得分:1)

r-help邮件列表上有一个recent discussion,其中有几个示例函数可以剥离&gt;从粘贴的代码模仿Windows R GUI的“仅粘贴命令”命令。

答案 9 :(得分:1)

这已经很老了,但您也可以使用knitr包编写文档。这样就可以创建输出,只需复制/粘贴到R会话中即可。

答案 10 :(得分:0)

类似于选择的答案,它已被放入名为RStudiohttps://github.com/dracodoc/mischelper)的Addin mischelper中,其中其功能之一正是这样做的。将其作为Addin的好处是您可以将其变成键盘快捷键,我认为此处发布的其他解决方案都没有此快捷键。通常粘贴为Ctrl + V,所以我有想要从控制台复制为Ctrl + B的脚本/代码。粘贴:

> x <- rnorm(10)
> x
 [1] -1.5337  0.7866  0.2721 -1.9644  0.0648  1.1001 -0.1761 -0.9213 -1.5025  1.3947

为:

x <- rnorm(10)
x
#  [1] -1.5337  0.7866  0.2721 -1.9644  0.0648  1.1001 -0.1761 -0.9213 -1.5025  1.3947

可能会对某人有所帮助。...