代码之家  ›  专栏  ›  技术社区  ›  TimTeaFan

如何将缩进与`rstudioapi::insertText一起使用`

  •  0
  • TimTeaFan  · 技术社区  · 3 年前

    我有一个字符串,我想使用{rstudioapi}将其缩进粘贴到RStudio中。下面是一个简单的测试字符串:

    test_str <- "for (i in seq_along(x)) {\nout[[i]] <- sum(x[[i]])\n}"
    cat(test_str)
    
    #> for (i in seq_along(x)) {
    #> out[[i]] <- sum(x[[i]])
    #> }
    

    复制控制台输出并将其手动粘贴到RStudio中的R脚本时,输出具有一个制表符的正确缩进,该制表符等于两个空格(我的默认设置):

    # this is my desired output (directly in a script, not the console):
    for (i in seq_along(x)) {
      out[[i]] <- sum(x[[i]])
    }
    

    使用时 rstudioapi::insertText 将字符串插入脚本中而不进行缩进:

    rstudioapi::insertText(test_str)
    
    for (i in seq_along(x)) {
    out[[i]] <- sum(x[[i]]) # one tab (equalling two spaces) is missing
    }
    

    使用时如何添加缩进 rstudioapi::insertText 或者{rstudioapi}包中的任何其他函数?

    阅读文档后,我发现了如何阅读缩进的系统首选项:

    rstudioapi::readRStudioPreference("num_spaces_for_tab")
    #> 2
    

    然而,我不知道该怎么做 insertText 使用这些信息。

    更多背景:
    我正在寻找一种方法,以编程方式将缩进添加到字符串输出中。这意味着,我不想手动添加 \t 到应该有缩进的行。我在一个软件包中,必须处理用户输入,这使得计算所需的正确缩进量可能非常困难。在上面的示例中,第1行和第3行不需要缩进,而第2行需要一个制表符或两个空格。

    理想情况下,我只想使用{rstudioapi}或base R documentation 插入文本 还有一个位置参数,用于脚本中的位置或范围。我不确定这是否可以用来包括缩进。

    我还研究了{datapasta}包,它也使用{rstudioapi}和 here 这个 "num_spaces_for_tab" 选项用于 output_context (在名为 oc$nspc ),但我不确定如何将其应用于我的问题。

    0 回复  |  直到 3 年前
        1
  •  2
  •   Waldi    3 年前

    你可以用 rstudioapi::executeCommand 发射 reindent reformatCode 命令:

    如果运行以下命令 在一起 在编辑器中(例如 ctrl+A Ctrl+Enter ):

    test_str <- "for (i in seq_along(x)) {\nout[[i]] <- sum(x[[i]])\n}"
    rstudioapi::insertText(test_str)
    
    # Should be adapted to the range you want to reformat (here : all lines)
    ranges <- rstudioapi::document_range(c(1, 0), c(Inf, Inf))
    rstudioapi::setSelectionRanges(ranges)
    rstudioapi::executeCommand('reformatCode')
    
    

    你会得到:

    for (i in seq_along(x)) {
      out[[i]] <- sum(x[[i]])
    }
    

    可用命令ID列表可用 here .

        2
  •  1
  •   manro    3 年前

    缩进特征 在里面 rstudioapi 图书馆

    但我知道 styler 有这种可能性。

    也许,这对你也有帮助。

    举个例子:

    library(styler)
    
    test_str <- "for (i in seq_along(x)) {\nout[[i]] <- sum(x[[i]])\n}" #your code
    
    style_text(test_str, indent_by = 3)
    

    输出:

    for (i in seq_along(x)) {
       out[[i]] <- sum(x[[i]])
    }
    

    让我们把这个加进去 insertText

    > rstudioapi::insertText(style_text(test_str, indent_by = 3))
    named list()
    > for (i in seq_along(x)) {
    +    out[[i]] <- sum(x[[i]])
    + }
    

    有效吗?


    加上

    也许是这个?

    添加 \t 给我们的绳子。

    test_str <- "for (i in seq_along(x)) {\n\tout[[i]] <- sum(x[[i]])\n}"
    

    因为你想看看 两个空间 ,让我们这样做:

    > insertText(gsub('\\t','  ', test_str))
    named list()
    > for (i in seq_along(x)) {
    +   out[[i]] <- sum(x[[i]])
    + }
    

    祝你好运;)

    推荐文章