在gdf [gWidgets2RGtk2]中添加行时插入“”而不是NA

时间:2014-01-17 02:04:11

标签: r gwidgets

在gdf中创建新行时是否可以插入“”而不是NA?

编辑:这是我尝试的一些示例代码

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

2 个答案:

答案 0 :(得分: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" 

但似乎还没有实施。

答案 1 :(得分:1)

好吧,Richie做了他平常的工作。这个问题有一些问题:一个是你使用变量h作为全局变量(对于gdf对象)和作为处理程序的参数,所以在处理程序h中没有引用该对象,但h$obj会。秒要在gdf对象中设置选择值,请使用[<-方法(h[i,j] <- ""调用h对象的set_items方法。您试图修改对象,而不是在其上调用方法。对于NA值,要选择的项目的基础是RGtk2DataFrame,如果您尝试将字符值放入数值中,它就像R中的数据框会将值强制转换为字符。最好,按照预期使用R.如果你真的想摆脱NA值,那么当你去使用用户编辑过的值时,你可以这样做,根据需要修改h[,]

现在,如果您真的想这样做,我认为您可以通过编写适当的单元格渲染器来达到RGtk2级别。