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

时间:2013-11-20 13:32:26

标签: r gwidgets

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

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

使用鼠标选择文本时,我们可以检索所选文本。

svalue(textwin, drop=T) # returns text
## [1] "grazes"

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

2 个答案:

答案 0 :(得分:1)

检索整个字符串和所选字符串。

all_text <- svalue(textwin, index=0)
selected_text <- svalue(textwin, index=0, drop = TRUE)

然后使用regexpr找到所选子字符串的索引。

rx_match <- regexpr(selected_text, all_text, fixed = TRUE)

用其他东西替换那个子串。

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

更新文本框。

svalue(textwin) <- all_text

计划B:使用svalue操纵index = 1的返回值。这几乎是正确的,但我认为gWidgets中有一个错误阻止它一般地工作。

# 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]))]
}

最大的问题是调用format会将索引号转换为字符串。它在单位数和双位数位置上的表现不佳。我很确定这是getMethod(.svalue, signature("gTexttcltk", "guiWidgetsToolkittcltk"))中的一个错误(尽管其他工具包也可能存在问题)。

答案 1 :(得分:1)

因为Richie说我很擅长修理东西,所以你走了:

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

我正在尝试只修复gWidgets中的错误,这是一个新功能,所以我不会在那里添加它。但是,这里有一些您可以在项目中轻松使用的代码:

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)

}