2013-11-20 3 views
1

Пусть (с использованием R/gWidgets) мы имеем простое текстовое окно, как это:Как заменить текст в gtext (R/gWidgets)?

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

При выборе текста с помощью мыши мы можем получить выбранный текст.

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

Сейчас мой вопрос: Есть ли способ заменить выделенный текст в gtext?

ответ

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 

Plan 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")) (хотя могут быть проблемы и в других инструментах).

+0

Но RegExp не знает положения курсора, это работает только в том случае, если извлеченный шаблон уникален или первый случай; else (с повторяющимся рисунком) мы не можем решить, какой шаблон выбрать. Иначе говоря, это не сработает, если я буду отмечать последние «ссадины» в этом предложении: «Верблюд пасутся в пустыне, пасутся и пасутся». Я бы получил: «Верблюжьей обезьяны в пустыне и ссадины и пасти .'' вместо '' Верблюд пасутся в пустыне и ссадины и обезьяны .'' – petermeissner

+0

Ха, это хорошо - это работает только для меня с tcltk, а не с GTK, но я не против - но это *** *** * !? ") § * переформатирование' '1.1'' и' '1.10'' в' '1.1'' (первый символ первой строки) делает его бесполезным на данный момент, верно ?. - - спасибо за усилие – petermeissner

+0

@marvin_dpr Да, он сломан. Отправьте отчет об ошибке Джону Верцани. Он хорошо разбирается в вещах. Вы можете получить его контактные данные из 'packageDescription (« gWidgets », fields =« Maintainer »)'. –

1

С Ричи говорит, что я хорошо о фиксации вещей, здесь вы идете:

В gWidgets2 эта функция была добавлена ​​в версии развития на GitHub. Используйте devtools для установки.

Я пытаюсь исправить ошибки в gWidgets, и это новая функция, поэтому я не собираюсь ее добавлять. Однако, вот какой код вы можете легко использовать в своем проекте:

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

    view <- [email protected]@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 <- [email protected]@widget 

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

    if (length(range) > 0) 

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

} 
+0

Использование, если список возился с блоком кода. Я не знаю, почему именно, но удалив пули, исправил это. – Dason

+0

спасибо за исправление, что – jverzani

+0

Спасибо, что сделали gWidgets и gWidgets2 – Dason