2013-10-27 4 views
0

Хорошо, мне потребовалось некоторое время, чтобы создать фрагмент кода, который реплицирует мою проблему. Вот. Обратите внимание: если вы запустите команду new("FirstSet", id = "Input", multiplier = 2) , вы получите правильный ответ. Однако, если вы попытаетесь создать класс, содержащий оба, вы получите следующее: Error in .local(.Object, ...) : argument "id" is missing, with no default. Это буквально лучшее, что я могу сделать, чтобы объяснить/показать проблему.Создайте суперкласс класса S4 - с примером кода

В чем я ошибаюсь?

setClass("Details", 
    representation(
     ID = "character", 
     Anumber = "numeric")) 

Input <- new("Details", 
     ID = "Input", 
     Anumber = 2) 

setClass("FirstSet", 
    representation(
    Anothernumber = "numeric")) 

setGeneric(
name = "FirstSet", 
def = function(object){standardGeneric("FirstSet")} 
) 

setMethod("initialize", 
     signature(.Object = "FirstSet"), 
     function (.Object, id, multiplier) 
     { x = [email protected] 
     y = x * multiplier 

     [email protected] = y 
     return(.Object) 
     } 
) 

setClass("Super", contains = c("Details", "FirstSet")) 

Исправленный код дает новую ошибку. Я следовал инструкциям на этой должности и решил свою проблему. Я также создал общий и метод для «Супер», см. Код ниже. Теперь я получаю новую ошибку. Ошибка в .local (.Object, ...): попытка получить слот «Anumber» из объекта базового класса («символ») без слотов. Человек, это изматывает, я думал, что у меня это есть.

Целью подробностей является то, что будет много файлов, которые будут сериализованы, и методы будут вызваны в зависимости от характеристик данных в файле. Возможно ли это в R, или я пытаюсь сделать то, что R не может сделать?

Новый код

setClass("Details", 
representation(
    ID = "character", 
    Anumber = "numeric")) 

setGeneric("Details", 
def = function(object){standardGeneric("Details")}) 

setMethod("initialize", 
signature(.Object = "Details"), 
function(.Object, ID = character(), Anumber = numeric()){ 
    [email protected] = ID 
    [email protected] = 2 
    return(.Object) 
}) 

setClass("FirstSet", 
representation(
    Anothernumber = "numeric")) 

setGeneric(
name = "FirstSet", 
def = function(object){standardGeneric("FirstSet")} 
) 

setMethod("initialize", 
signature(.Object = "FirstSet"), 
function (.Object, id = character(), multiplier = numeric()) 
{ x = [email protected] 
    y = x * multiplier 

    [email protected] = y 
    return(.Object) 
} 
) 

setClass("Super", contains = c("Details", "FirstSet")) 

setGeneric("Super", 
def = function(object){standardGeneric("Super")}) 

    setMethod("initialize", 
    signature(.Object = "Super"), 
    function(.Object, id = character(), Anumber = numeric()){ 
    Details <- new("Details", ID = id, Anumber = Anumber) 
    FirstSet <- new("FirstSet", Anothernumber = Anothernumber) 
    Super <- new("Super", Details, FirstSet) 
    return(.Object) 
}) 
+0

Я считаю, что детали следует рассматривать как ссылочный класс. Это верно? –

ответ

1

Основное правило заключается в том, что new("FirstSet") (или любой не виртуальный класс) должен работать. У вас нет (потому что аргументы intiailize не имеют значений по умолчанию). См. this answer для получения дополнительных рекомендаций.

+0

Спасибо, Мартин, я вижу, что я делаю неправильно. –

Смежные вопросы