2014-01-17 5 views
0

Можно ли вставить «» вместо NA при создании новой строки в gdf?Вставить «» вместо NA при добавлении строк в gdf [gWidgets2RGtk2]

EDIT: Вот пример кода, который я попытался

require(gWidgets2RGtk2) 
df <- data.frame(x=1:5,y=6:10) #Sample data frame 
w2 <- gwindow("keyfile editor") 
h <- gdf(df,cont=w2) 
addHandlerChanged(h, handler = function(h,...){ #Handler to remove NA 
h<<-apply(h[1:nrow(h),1:ncol(h)], 2, function(x) gsub("NA","",x)) 
}) 
+0

'' '' НЕ пробелы. Если 'addHandlerChanged' является функцией R из внесенного пакета, вы должны включить вызов' library' или 'require', который загружает его. –

+0

Спасибо, я добавил это. –

+0

Я понимаю, что у вас есть интересная смесь функций и функций определения функции, и поскольку вы только что опубликовали ошибочный код, может быть трудно угадать ваши намерения. Также: 'w2 <- gwindow (« редактор ключей ») Ошибка: не удалось найти функцию« gwindow »' –

ответ

2
svalue(h$obj, drop = FALSE) 

дает вам новое значение для обновленной строки. Таким образом, в теории,

addHandlerChanged(h, handler = function(h,...) { 
    svalue(h$obj, drop = FALSE)[] <- lapply(
    svalue(h$obj, drop = FALSE), 
    function(x) { 
     x[is.na(x)] <- "" 
    } 
) 
} 

должен заменить все NA с с "". Есть две проблемы:

Во-первых, замена отсутствующих значений пустой строкой преобразует весь столбец в вектор символа, который вам, вероятно, не нужен, а во-вторых, существует проблема с svalue<-, что означает значения не обновляются.

Я думаю, что проблема заключается в следующей:

methods(`svalue<-`) 
## [1] svalue<-.default*  svalue<-.GCheckbox* svalue<-.GFormLayout* svalue<-.GGroup*  
## [5] svalue<-.GHtml*  svalue<-.GLabel*  svalue<-.GMenuBar* svalue<-.GRadio*  
## [9] svalue<-.GToolBar* svalue<-.GTree* 

показывает, что нет GDf -специфического метода для установки SValue, так svalue<-.default будет называться.

gWidgets2:::`svalue<-.default` 
## function (obj, index = NULL, ..., value) 
## { 
##  if (!isExtant(obj)) { 
##   return(obj) 
##  } 
##  if (getWithDefault(index, FALSE)) 
##   obj$set_index(value, ...) 
##  else obj$set_value(value, ...) 
##  obj 
## } 

Это вызывает метод set_value объекта.

ls(attr(h, ".xData")) 
## [1] "add_cell_popup"   "add_popup_to_view_col" "add_to_parent"   
## [4] "add_view_columns"  "block"     "block_editable_column" 
## [7] "cell_popup_id"   "change_signal"   "clear_stack"    
## [10] "clear_view_columns"  "cmd_coerce_column"  "cmd_insert_column"  
## [13] "cmd_remove_column"  "cmd_replace_column"  "cmd_set_column_name"  
## [16] "cmd_set_column_names" "cmd_stack"    "coerce_with"    
## [19] "connected_signals"  "default_cell_popup_menu" "default_expand"   
## [22] "default_fill"   "default_popup_menu"  "freeze_attributes"  
## [25] "get_column_index"  "get_column_value"  "get_dim"     
## [28] "get_name"    "get_view_column"   "handler_id"    
## [31] "initFields"    "initialize"    "initialize#GComponent" 
## [34] "initialize#GWidget"  "invoke_change_handler" "invoke_handler"   
## [37] "is_editable"    "map_j"     "model"     
## [40] "not_deleted"    "notify_observers"  "parent"     
## [43] "set_editable"   "set_frame"    "set_name"    
## [46] "set_names"    "set_parent"    "store"     
## [49] "toolkit"     "unblock_editable_column" "widget" 

но, похоже, еще не реализовано.

+0

Интересно, что существует метод 'set_value' для h, но на самом деле это не-op. Метод 'set_index' выполняет работу по настройке выбранной строки.В этом случае я думаю, что 'set_items' необходим, так как это может изменить элементы для выбора. – jverzani

1

Ну, Ричи сделал свою обычную полноценную работу. У этого вопроса есть несколько проблем: один из них вы используете переменную h как глобальную переменную (для объекта gdf) и как аргумент для обработчика, поэтому внутри обработчика h не ссылается на объект, но h$obj будет. Второй Для установки значений для выбора в объекте gdf используется метод [<- (h[i,j] <- "" вызывает метод h объекта set_items). Вы пытались изменить объект, а не вызывать метод на нем. Что касается значений NA, то под элементами, которые нужно выбрать, является RGtk2DataFrame, который, как и кадр данных в R, будет принуждать значения к символу, если вы попытаетесь поместить значение символа в числовое значение. Лучше всего использовать R, поскольку он предназначен. Если вы действительно хотите избавиться от значений NA, вы можете сделать это, когда будете использовать значения, которые пользователь редактировал, изменяя h[,], как вы хотите.

Теперь, если вы действительно хотели это сделать, я думаю, вы могли бы на уровне RGtk2 написать соответствующий рендеринг ячеек.

+0

Спасибо за определение переменной h! К сожалению, я не очень хорош в RGtk2, поэтому я предполагаю, что самым простым способом является преобразование NA в "" после. –