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

Wil*_*ane 21 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
Run Code Online (Sandbox Code Playgroud)

如果我将其复制并粘贴到文档中或者甚至是这篇帖子中,那么您(和我的学生)不能只是突出显示它,复制它并将其粘贴到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
Run Code Online (Sandbox Code Playgroud)

您可能希望这样做来测试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
Run Code Online (Sandbox Code Playgroud)

可以被复制/粘贴到R对话成功.这对于我来说更容易为期刊文章,学生,讲座等准备R代码(也许对其他人来说?)

我没有运气地戳了一下文档...有什么想法吗?指针?

目前,我通过R.app GUI或终端在Mac上使用R.

Jak*_*ake 26

你可以试试:

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

注意引号之间的空格.

第一个选项使提示消失.第二个消除"+"出现在长包装线上.

  • 这是解决方案的完整一半......我知道提示选项,但不知道继续选项......这很有帮助。 (2认同)

Wil*_*ane 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)
}
Run Code Online (Sandbox Code Playgroud)

这让我可以突出显示并复制交互式会话的一部分.

所以,例如,我可以使用它来复制

> 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
Run Code Online (Sandbox Code Playgroud)

到剪贴板并通过简单的调用

> cleanCode() 
Run Code Online (Sandbox Code Playgroud)

产生诸如的输出

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
Run Code Online (Sandbox Code Playgroud)

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

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


Mar*_*off 5

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

我仍然在这里查看输出格式... 这个mailling列表帖子中有一些代码似乎在没有[#]块的情况下格式化输出,但它肯定不漂亮.


Mar*_*rek 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))
)
Run Code Online (Sandbox Code Playgroud)

您可以将其保存到文件中,然后使用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  
"))
Run Code Online (Sandbox Code Playgroud)

现在进行一些编辑:

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
Run Code Online (Sandbox Code Playgroud)

结果是:

> 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  
# 
Run Code Online (Sandbox Code Playgroud)

它的工作原理,但正如我说的那样痛苦.