#r #reference-class
Вопрос:
Я пытаюсь понять классы RC в R (безуспешно). У меня есть простая функция, которая возвращает объект класса Example
. Теперь я хотел бы использовать эту функцию в классе RC, где я реализую некоторые методы для нее. На данный момент я не понимаю, как структурировать свой код (например, если функция является одним r-скриптом, а класс RC я пытаюсь создать другой, или если они должны быть в одном и том же r-скрипте), и как правильно обращаться к объектам класса Example
, чтобы получить желаемый результат.
Ниже приведен пример:
example <- function(x, y){
tripplex <- x*3
doubbley <- y*2
xy_sum <- x y
Example <- list(trippled.x = tripplex, doubbled.y = doubbley, sum =xy_sum)
class(Example) <- "Example"
Example
}
### I now want to use this function in an RC class and write some methods for it. ###
testClass <- setRefClass("testClass",
fields=list(x = "numeric",y = "numeric"),
methods = list(
initialize = function(){
# I don't know what to initialize it as.
},
show = function() {
cat(paste0("Call:n", "x=", .self$x ,"n", "y=", .self$y))
# This doesn't print proper x,y values.
}))
Моя идея заключается в том, что я хочу что-то вроде этого вывода:
>object <- example(5, 10)
>print(object)
Call:
x=5
y=10
>
>object$trippled.x
15
С уважением
Ответ №1:
Вы ищете что-то подобное?
testClass <- setRefClass("testClass",
fields = list(
x = "numeric",
y = "numeric"
),
methods = list(
initialize = function(x, y) {
.self$x = x
.self$y = y
},
tripled_x = function() {
return(3 * .self$x)
},
show = function() {
cat(paste0("Call:n", "x=", .self$x ,"n", "y=", .self$y))
}))
object <- testClass(5, 10)
print(object)
#> Call:
#> x=5
#> y=10
object$tripled_x()
#> [1] 15
Создано 2021-09-20 с помощью пакета reprex (версия 2.0)
Комментарии:
1. Может быть, так оно и есть! Поскольку я не совсем понимаю структуру, трудно сказать. Я сам попробовал немного поэкспериментировать с этим — и это подводит меня к вопросу.
.self
(Переменные или объекты?) — обязательно ли их указывать в списке полей? Или можно было бы создать новый.self$
, например, в tripled_x, или как мы могли бы сослаться на эту функцию/метод и добавить ее в метод show?2. Если вы хотите , чтобы переменная постоянно хранилась в
object
, тоtestClass
эта переменная должна быть объявлена вfields
. Если вы хотите добавить вычисляемую переменную (например.self$triple_x
), то просто вычислите ее во времяinitialize
функции и сохраните — что-то вроде.self$triple_x = x * 3
. Возможно, если бы вы могли более подробно объяснить, чего вы пытаетесь достичь в своем вопросе, было бы легче дать конкретный ответ.3. Хорошо! Это задание в школе, поэтому я не хочу получать правильный ответ на это задание. Мне жаль, если это заставляет меня быть немного расплывчатым. Но теперь общая концепция начинает приобретать для меня больше смысла! На данный момент это просто методы. С помощью приведенного выше метода показа мы можем настроить инструкцию печати(объекта). Допустим, мы хотим реализовать два разных метода:
plot
amp;sums
. Чтобы вызвать их, мы определяем их в списке методов, а затем используемobject$plot()
иobject$sums
? Или есть более встроенные методы для доступа к ним, такие какplot(object)
иsums(object)
?4. 2-й вопрос, вроде как похожий. Есть ли способ изменить результат выполнения универсальной
summary(object)
функции?