2015-11-12 7 views
0

Его первая попытка использовать ООП в R, и мне сложно понять основную концепцию. Например, что это такое:Использование oop in R, неспособное понять концепцию

slot, setGeneric, representation 

Мне не удалось найти что-нибудь полезное, выполнив поиск в Интернете. Как они работают в R? Например, у меня есть следующий класс MATLAB:

classdef windTurbine < handle 
properties 
    NumOfBlades 
    [email protected] 
    sweptArea 
end 

methods 
    function obj = windTurbine(NumOfBlades,blade) 
     obj.NumOfBlades = NumOfBlades; 
     obj.blade = blade; 
     obj.sweptArea = CalcSweptArea(obj); 
    end 

    sweptArea = CalcSweptArea(obj) 
end 

Как это записать в R? Как добавить вычисления к конструктору? Сделать функции частными? И в основном используют CONSEPT ООП в R. Примером может быть полезным, или хороший учебник объяснение

+1

Вы прочитали: http://adv-r.had.co.nz/OO-essentials.html? – dickoa

ответ

1

В дополнение к http://adv-r.had.co.nz/OO-essentials.html, который представляет R объекты, как в базе и рекомендуемых пакетов, вы должны также R6, который гораздо ближе к тому, что вы делаете в Matlab. Ваш пример переводится так:

# Need to install R6 first: 
# install.packages("R6") 
library(R6) 

windTurbine <- R6Class("windTurbine", 
    public = list(
    # Properties (fields) 
    NumOfBlades = integer(0), 
    blade = NULL, # Which kind of object is it? 
    sweptArea = numeric(0), 

    # Methods 
    initialize = function(NumOfBlades, blade) { 
     self$NumOfBlades <- as.integer(NumOfBlades) 
     self$blade <- blade 
     self$sweptArea <- self$CalcSweptArea() 
    }, 

    CalcSweptArea = function() { 
     # < your code here> 
     # (Return a fake value, just for testing) 
     return(10) 
    } 
)) 

wt <- windTurbine$new(NumOfBlades = 6, blade = 3) 
wt$sweptArea 

Посмотрите на ?R6Class(). У вас также есть аргумент private = для частных полей или методов.

+0

Я начал использовать 'RefClass', но кажется, что' R6' лучше меня удовлетворяет. Спасибо за ответ. –

+0

btw, потому что вы упомянули также в своих комментариях: как утверждать, что «лезвие» - это тип другого класса, например, «Blade»? –

+1

Вы можете протестировать его так: 'if (наследует (лезвие,« Blade »)) else stop (« клинок должен быть «объектом Blade») –