2015-02-25 3 views
0

Я хочу создать список (в основном объект с пользовательским классом), который содержит базу данных в одном из элементов и функцию в другом элементе. После инициализации списка я хочу иметь возможность вызвать функцию и изменить ее элемент, содержащий базу данных. Вот пример того, что я имею в видуИзменение элемента списка из другого элемента из того же списка

newObject<- function(dataSet){ 
    rtrn <- list() 
    rtrn$dataHolder <- dataSet 
    rtrn$addition <- function(numberToAdd){ 
    rtrn$dataHolder <- rtrn$dataHolder + numberToAdd 
    } 
    class(rtrn) <- "customClass" 
    return(rtrn) 
} 

x <- newObject(c(1,2,3)) 
x$addition(1) 

Вызов метода сложения() фактически не изменять элемент dataHolder. Я пробовал < < - как оператор присваивания (так как я изменяю переменную за пределами функции), но это, похоже, не работает

+0

Я не понимаю вас, логика. Почему бы не подумать в терминах fung prog/математической функции, где вы просто определяете функцию, принимающую в качестве аргумента список, поле, число и возвращаемое это поле списка, увеличивающееся на число? –

+0

Кстати, очень плохо назвать функцию «newObject». Используйте скорее глагол/действие, которые четко описывают действие вашей функции. –

+0

Благодарим вас за отзыв. «newObject» предназначен только для этого примера, предназначенный для использования в качестве конструктора объекта. Что касается предложения по функциональному программированию, то это то, что я сейчас использую, но мне просто интересно, могу ли я содержать методы внутри объекта - я думал, что это облегчит чтение, если у меня есть несколько объектов, содержащих разные базы данных и все, что мне нужно сделать для обработки этих наборов данных, - это просто вызов метода, уже сохраненного в этих объектах. – Grittly

ответ

0

Ваш пример - это почти closure. Если вы исправить свой «класс» в:

newObject<- function(dataSet) { 
    dataHolder <- dataSet 
    addition <- function(numberToAdd){ 
    dataHolder <<- dataHolder + numberToAdd 
    } 
    getdata <- function() { 
    dataHolder 
    } 

    rtrn <- list(addition = addition, getdata = getdata) 
    class(rtrn) <- "customClass" 
    return(rtrn) 
} 

вы приблизитесь к тому, что вы хотите:

x <- newObject(c(1,2,3)) 
x$getdata() 
[1] 1 2 3 
x$addition(1) 
x$getdata() 
[1] 2 3 4 

Так как вы определили свой собственный class, вы можете также определить функцию печати:

print.customClass <- function(x){ print(x$getdata()) } 

И увидеть "интерьер" по

x 
[1] 2 3 4 
+0

Спасибо! Это именно то, что я искал! – Grittly

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