如何替换gtext(R/gWidgets)中的文本?

如何替换gtext(R/gWidgets)中的文本?,r,gwidgets,R,Gwidgets,假设(使用R/gWidgets)我们有一个简单的文本窗口,如下所示: require(gWidgets) textwin <- gtext("The camel grazes in the desert.", container=gwindow()) 现在我的问题是:是否有办法替换gtext中的选定文本?检索整个字符串和选定的字符串 all_text <- svalue(textwin, index=0) selected_text <- svalue(textwin, in

假设(使用R/gWidgets)我们有一个简单的文本窗口,如下所示:

require(gWidgets)
textwin <- gtext("The camel grazes in the desert.", container=gwindow())

现在我的问题是:是否有办法替换gtext中的选定文本?

检索整个字符串和选定的字符串

all_text <- svalue(textwin, index=0)
selected_text <- svalue(textwin, index=0, drop = TRUE)
用其他内容替换该子字符串

substring(
  all_text, 
  rx_match, 
  rx_match + attr(rx_match, "match.length") - 1
) <- "monkey"

最大的问题是调用
format
,将索引号转换为字符串。与两位数的位置相比,一位数的位置打得不好。我很确定这是
getMethod(.svalue,signature(“gTexttcltk”,“guiWidgetsToolkittcltk”)
中的一个bug(尽管其他工具包中也可能存在问题)

既然里奇说我擅长修理东西,那就来吧:

gWidgets2
中,此功能已添加到github的开发版本中。使用devtools安装

我试图只修复gwidget中的bug,这是一个新特性,所以我不打算在那里添加它。但是,以下是一些可以在项目中轻松使用的代码:

library(RGtk2)    
replace_selected <- function(gtext_widget, value) {

  view <- gtext_widget@widget@widget

  buffer <- view$getBuffer()

  bnds <- buffer$getSelectionBounds()

  if(bnds$retval) {

    buffer$insert(bnds$start, as.character(value), -1)

    new_bnds <- buffer$getSelectionBounds()

    buffer$delete(new_bnds$start, new_bnds$end)

  }
}

## replace_selected in gWidgetstcltk

replace_selected <- function(gtext_widget, value) {

  widget <- gtext_widget@widget@widget

  range <- as.numeric(tktag.ranges(widget, "sel"))

  if (length(range) > 0)

     tcl(widget,"replace", "sel.first", "sel.last", value)

}
库(RGtk2)

替换选中的但RegExp不知道光标的位置,这仅在提取的模式唯一或第一次出现时有效;否则(对于重复模式),我们无法决定要选择哪个模式匹配。换言之,如果我在这句话中标记最后一个“吃草”,这将不起作用:
骆驼在沙漠中吃草,吃草,吃草。
我将得到:
骆驼在沙漠中吃草,吃草,吃草。
骆驼在沙漠中吃草,吃草,吃草。
哈哈,这很好——它只适用于我使用tcltk,而不适用于GTK,但我不介意——但这个******!?”)§将
1.1
1.10
重新格式化为
1.1
(第一行第一个字符)会使其目前毫无用处,对吗?--感谢您的帮助effort@marvin_dpr是的,它坏了。给约翰·维扎尼发一份错误报告。他很擅长修理东西。你可以从
packageDescription(“gWidgets“,fields=“Maintainer”)
。如果列表与代码块发生冲突,则使用此选项。我不知道确切原因,但删除项目符号可以解决此问题。感谢制作gWidgets和gWidgets2
substring(
  all_text, 
  rx_match, 
  rx_match + attr(rx_match, "match.length") - 1
) <- "monkey"
svalue(textwin) <- all_text
# Get the index of the lines/character positions to start and finish
i <- format(svalue(textwin, index = 1, drop = TRUE), digits = 3)
i <- sapply(strsplit(i, "\\."), as.numeric)

# Get all the text as a character vector
all_text <- svalue(textwin, index=0)
all_text <- strsplit(all_text, "\n")[[1]]

# Replace the selected portion
replacement <- "monkey"

if(i[1, 1] == i[1, 2])
{
  svalue(textwin) <- substring(all_text[i[1, 1]], i[2, 1], i[2, 2])
} else
{
    all_text[i[1, 1]] <- paste0(
      substring(all_text[i[1, 1]], 1, i[2, 1]),  
      replacement,
      substring(all_text[i[1, 2]], 1, i[2, 2])
    )
    svalue(textwin) <- all_text[-((i[1, 1] + 1):(i[1, 2]))]
}
library(RGtk2)    
replace_selected <- function(gtext_widget, value) {

  view <- gtext_widget@widget@widget

  buffer <- view$getBuffer()

  bnds <- buffer$getSelectionBounds()

  if(bnds$retval) {

    buffer$insert(bnds$start, as.character(value), -1)

    new_bnds <- buffer$getSelectionBounds()

    buffer$delete(new_bnds$start, new_bnds$end)

  }
}

## replace_selected in gWidgetstcltk

replace_selected <- function(gtext_widget, value) {

  widget <- gtext_widget@widget@widget

  range <- as.numeric(tktag.ranges(widget, "sel"))

  if (length(range) > 0)

     tcl(widget,"replace", "sel.first", "sel.last", value)

}