Возврат копии data.table из метода ReferenceClass

Я пытаюсь вернуть копии data.tables из методов ReferenceClass:

dummy <- setRefClass(
  "dummy",
  fields = list(
    dt = "data.table"
  ),
  methods = list(
    initialize = function( df ){
      if( !missing( df ) ){
        dt <<- data.table( df , key = "a" )
      }
    },
    getTab = function( ix ){
      return( copy(dt[ ix, ]) )
    }
  )
)

Однако вызов dummy$getTab() приводит к ошибке, которую я не понимаю:

d <- dummy$new( data.frame( a = 1:10, b = 1:10 ) )
d$getTab( 2:5 )

Error in if (shallow) assign(field, get(field, envir = selfEnv), envir = vEnv) else { : 
  argument is not interpretable as logical
In addition: Warning message:
In if (shallow) assign(field, get(field, envir = selfEnv), envir = vEnv) else { :
 the condition has length > 1 and only the first element will be used

Я понятия не имею, что это значит и откуда это взялось. Плюс без проблем работают следующие две процедуры:

copy( d$dt[ 2:5 ] )

mycopy <- function( dt, ix ) {
  return( copy(dt[ ix, ]) )
}
mycopy( d$dt, 2:5 )

Любая помощь приветствуется.


person Beasterfield    schedule 15.05.2013    source источник


Ответы (1)


Хорошо, извините, это была глупая ошибка, я просто просмотрел метод envRefClass$copy(). Таким образом, решение состоит в том, чтобы вызвать data.table::copy явно:

dummy <- setRefClass(
  "dummy",
  fields = list(
    dt = "data.table"
  ),
  methods = list(
    initialize = function( df ){
      if( !missing( df ) ){
        dt <<- data.table( df , key = "a" )
      }
    },
    getTab = function( ix ){
      return( data.table::copy(dt[ ix, ]) )
    }
  )
)
person Beasterfield    schedule 15.05.2013