【问题标题】:Change default prompt and output line prefix in R?更改 R 中的默认提示符和输出行前缀?
【发布时间】:2010-11-29 17:37:48
【问题描述】:

出于教学和准备有关 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。

【问题讨论】:

    标签: r


    【解决方案1】:

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

    > options(prompt = "# 自定义 R 提示符!\n") # 定制的 R 提示! 1 + 5 [1] 6 # 定制的 R 提示!

    将提示设置为空字符串会导致:

    > 选项(提示="") 选项错误(提示 =“”):“提示”的值无效

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

    我还在研究输出格式...this mailling list post 有一些代码似乎可以格式化没有 [#] 块的输出,但它肯定不漂亮。

    【讨论】:

    • 你说得对,它必须是一个非空字符串......(想知道他们为什么需要那个......),但是一个空格似乎效果很好: options(prompt= " ")
    【解决方案2】:

    你写的

    永远存在的事情之一 让我沮丧的是我不能简单地 从 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。

    【讨论】:

      【解决方案3】:

      我还有两个建议:

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

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

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

      savehistory(file = ".Rhistory")

      然后你可以用这个命令把它作为脚本文件打开:

      edit(file=".Rhistory")

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

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

      【讨论】:

      • 你是对的。这种方法的问题在于,在开发教学示例时,与进行直接数据分析时相比,使用 R 时通常更加“交互式”。您正在使用功能、选项、输出样式等,以至于历史的正常流程充满了噪音,并且您希望能够从该会话中提取正确的项目集......我有花了相当多的时间查看历史文件,试图找到我拥有完美系列示例的那一刻......但根据我的经验,这是一个时间沉没。
      • 这是一个公平的观点。我通常发现历史文件也很混乱。在这种情况下(假设其他提示调整答案都不起作用),我建议只使用脚本文件并逐行运行它。找到适合您的 GUI。它很容易进行实验,到最后你将拥有一个完整的 R 文件来进行教学。你甚至可以打包你的脚本:你会在 CRAN 上看到几个统计课程的例子。
      【解决方案4】:

      你可以试试:

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

      注意引号之间的空格。

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

      【讨论】:

      • 这是整个解决方案的一半...我知道提示选项,但不知道继续选项...这很有帮助。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          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  
          # 
          

          它有效,但正如我所说,它很痛苦。

          【讨论】:

          • 这使我找到了一个非常可行的解决方案,我必须将其作为“答案”发布,因为 cmets 不能很好地处理代码格式或长帖子。在这个线程的其他地方查看我的 cleanCode() 函数......这是对 Marek 解决方案的直接即兴表演。
          【解决方案8】:

          所以,我非常喜欢 Jake 和 Marek 的解决方案。 Jake's 很简单,但没有解决问题的输出格式部分。 Marek 有点麻烦,所以我把它包装在一个函数中,结果是

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

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

          【讨论】:

          • 我喜欢。使用函数是个好主意。对于 Windows(以及 Ubuntu),第一行应该是:to_edit
          • cmdPrompts &lt;- gsub("+","\\+",cmdPrompts, fixed=TRUE) 将处理 + 号。不确定是否有必要泛化处理其他特殊字符的函数。如果有人知道足以自定义他们的继续提示,他们应该能够弄清楚如何相应地编辑此功能。
          【解决方案9】:

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

          【讨论】:

            【解决方案10】:

            进入游戏很晚,只是指出几乎任何想要的东西都可以放入提示中。向许多 unix 程序员的 shell 提示致敬:

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

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

            【讨论】:

              【解决方案11】:

              与选择的答案类似,这已被放入名为 mischelper (https://github.com/dracodoc/mischelper) 的 RStudio Addin 中,其中一个功能正是这样做的。将其作为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
              

              可能对某人有帮助....

              【讨论】:

                猜你喜欢
                • 2018-08-21
                • 2017-01-01
                • 1970-01-01
                • 2019-03-29
                • 2016-12-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-09-24
                相关资源
                最近更新 更多