2009-09-19 24 views
19

为了教导和准备关于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.app GUI或从终端在Mac上使用R.

回答

15

所以,我非常喜欢杰克和马立克的解决方案。杰克的直截了当,但没有解决输出格式化问题的一部分。马立克氏是有点麻烦,所以我把它包起来的函数导致

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会话中以执行代码并比较他们的输出。当然,在这种情况下,他们会得到不同的结果,因为我以随机数据为基础的例子。

谢谢杰克,马雷克和其他人......所有的回应都很有帮助!

+1

我喜欢它,使用函数是一个好主意。 Ubuntu的太)应该是: to_edit < - readLines(“剪贴板”) – Marek 2009-09-20 20:57:37

+1

cmdPrompts < - gsub(“+”,“\\ +”,cmdPrompts,fixed = TRUE)'将处理+符号。确定有必要将函数概括为处理其他特殊字符,如果有人知道足以自定义它们的延续提示,那么他们应该能够弄清楚如何编辑这个函数。 – drammock 2013-05-08 03:58:45

5

至于改变提示,你要找的命令是options,参数prompt,我发现here

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

在提示设置为空字符串的结果:

​​

这就是为什么我用了评论。据我所知,R没有块评论,这就是为什么我提示行注释,并在其末尾添加换行符 - 应该是没有问题,如果有人以这种方式复制粘贴会话。

我还在寻找输出格式的一点点......这里有一些代码this mailling list post似乎格式化输出没有[#]块,但它肯定不是很漂亮。

+0

你是正确的,它必须是一个非空字符串...(不知道为什么他们需要....),但单一的空间似乎运作良好:选项(提示=”“) – 2009-09-20 14:34:46

1

你写

的这总是 的事情之一我感到沮丧的是,我不能简单地复制 命令和输出R和 它们粘贴到另一个R对话。

我假设你使用标准R Windows二进制文件在Windows上。我担心你的想法可能不可行。但是因为你想要做的事实际上是非常可取的,所以人们以不同的方式做了。从ESS手册:

5操纵保存转录文件

劣质S模式记录在过程 缓冲器转录 (所有命令的执行的列表, 和它们的输出),其可以被保存作为 “成绩单文件”,其中 通常具有后缀“.St”。 对于成绩单文件 最明显的用途是作为您在特定会话中执行的动作 的静态记录。然而,有时候,您可能希望 通过将 提交给正在运行的ESS进程来重新执行转录文件中记录的 命令。这是 是Transcript模式的用途。

如果您将带有后缀 的文件a加载到Emacs中,它将被放置在S Transcript模式中。 [...]

切换到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.

3

我有另外两个建议:

1)您可以在脚本文件中编写代码;那么你可以复制和粘贴代码没有任何问题。

从标准的R GUI中,进入File> New Script。在那里输入所有的代码,然后运行它,只需突出显示代码并按下CTRL-R即可。许多其他R GUI也有类似的行为。您仍然可以在此模式下交互式工作;关键区别在于您突出显示代码并运行它而不是按下ENTER键。

2)使用history()函数。查看帮助:?历史。您可以保存您的控制台历史记录本:

savehistory(file = ".Rhistory")

然后你就可以打开它与这个命令的脚本文件:

edit(file=".Rhistory")

你也可能要改变max.show甚至可能是您自己的.Rprofile中的默认值。例如,

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

+0

你对了。这种方法的问题在于,当你开发教学示例时,与R进行直接数据分析时相比,使用R更加“互动”。您正在玩的功能,选项,输出风格等等,以至于历史的正常流动充满了噪音,而且您希望能够从该会话中提取正确的一组项目......我有花了相当长的时间浏览历史档案,试图找到那一刻,当我有一系列完美的例子时......但是根据我的经验,这是一个沉没的时刻。 – 2009-09-20 14:14:29

+0

这是一个公平点。我通常也会发现历史文件非常混乱。在这种情况下(假设其他提示调整答案都不起作用),我建议只从脚本文件开始逐行运行。找到一个适合你的GUI。这是很容易的实验,最后你会有一个完整的R文件来教。甚至可以将脚本打包:你会看到几个关于CRAN的统计课程的例子。 – Shane 2009-09-20 15:27:51

25

您可以试试:

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

注意在引号之间的空间。

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

+1

这是解决方案的全部一半......我知道提示选项,但不知道继续选项......这有助于很多。 – 2009-09-20 14:16:06

+0

现在,如果有前缀输出选项! – 2009-09-20 14:33:19

+0

是否有可能在每个R会话中使其成为永久的? – qed 2012-10-22 13:44:03

1

不知道这是否支持所有的平台,但在Windows上,您可以复制,然后右击并选择“粘贴命令只”,这不正是你需要的。不幸的是,没有键盘快捷键。

+0

在Mac上的R.app似乎不是一个选项.... :( – 2009-09-20 14:18:05

1

在r-help邮件列表上有一个recent discussion,有几个示例函数可以从粘贴的代码中去除模拟Windows R GUI的“仅粘贴命令”命令。

5

痛苦的方法是正则表达式的原始输出。假设你有一些代码:

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 
# 

它的工作原理,但正如我说这是痛苦的。

+0

这使我成为一个非常可行的解决方案,我将不得不作为“答案”发布,因为评论没有处理代码格式化或很长的帖子,看看我的cleanCode()函数,在这个线程中的其他地方...这是马立克解决方案的一个直接的即兴编码 – 2009-09-20 15:17:13

1

这是相当老,但也可以使用knitr包编写文档。这将创建输出,您可以将其复制/粘贴到R会话中。