Я новичок в объектно-ориентированном программировании в R и борюсь с тем, как правильно писать функцию, которая модифицирует объект.Измените объект S3, не возвращая его?
Этот пример работает:
store1 <- list(
apples=3,
pears=4,
fruits=7
)
class(store1) <- "fruitstore"
print.fruitstore <- function(x) {
paste(x$apples, "apples and", x$pears, "pears", sep=" ")
}
print(store1)
addApples <- function(x, i) {
x$apples <- x$apples + i
x$fruits <- x$apples + x$pears
return(x)
}
store1 <- addApples(store1, 5)
print(store1)
Но я полагаю, должна быть чист способом сделать это без возврата всего объекта:
addApples(store1, 5) # Preferable line...
store1 <- addApples(store1, 5) # ...instead of this line
Что такое правильный способ написать модифицируют-функцию в R? "< < -"?
Обновление: Спасибо всем, что стало камнем Rosetta для ООП в Р. Очень информативно. Проблема, которую я пытаюсь решить, очень сложна с точки зрения потока, поэтому жесткость ссылочных классов может помочь структуре. Хотел бы я принять все ответы как ответы, а не только один.
Если вы действительно хотите изменить на месте, то, возможно, вы не должны использовать объекты S3, но [ссылка класс] (http://adv-r.had.co.nz/OO-essentials. html # rc). – Andrie
Хороший товар. Цель ссылочного класса внезапно имеет смысл. – Chris