Создание нового класса с параметрами из функции - PullRequest
0 голосов
/ 16 января 2019

AIM: Я хотел бы добавить «распределение» и «параметры» к выводу summary функции, которую я создал.

Созданная мной функция принимает n и выбор распределения и возвращает случайные числа из этого распределения. Выводом функции является объект класса MyClass.

Далее я создал функцию summary для объектов MyClass, которая в настоящее время возвращает длину, среднее значение и стандартное отклонение выходных данных.

ПРОБЛЕМА: Мне бы хотелось, чтобы функция summary также распечатывала исходные параметры функции random_number_generator, см. ОПИСАНИЕ ПОИСКА ниже.

random_number_generator <- function(n,distribution,mean=NULL,sd=NULL,lambda=NULL,size=NULL,prob=NULL){
  if (distribution=="Normal"){
   x <- rnorm(n=n,mean=mean,sd=sd)
  }
  
  if (distribution=="Poisson"){
  x <- rpois(n=n, lambda=lambda)
  }
  
 if (distribution=="Binomial") {
  x <- rbinom(n=n,size=size,prob=prob)
 }
  
  class(x) <- "MyClass"
  return (x)
}

answer <- random_number_generator(n=10, distribution = "Binomial",size=15,prob=0.4)


summary.MyClass <- function(x) {
    stopifnot(inherits(x, "MyClass"))
    cat("\t\n", 
        sprintf("Sample size: %s\n", length(x)),
        sprintf("Mean: %s\n", mean(x)),
        sprintf("Standard Deviation: %s\n", sd(x))
        )
}

ТЕКУЩИЙ ВЫХОД:

summary(answer)
	
 Sample size: 10
 Mean: 4.9
 Standard Deviation: 1.59513148186739

желаемый выход:

class(answer)
[1] "MyClass"

summary(answer)

    Sample size: 10
    Mean: 4.9
    Standard Deviation: 1.59513148186739
    Distribution: "Binomial"
    Size: 15
    Prob: 0.4

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы также можете сохранить ваши параметры в качестве атрибутов вашего возвращаемого значения. Таким образом, вы не получите список обратно, если не хотите этого:

random_number_generator <- function(n,distribution,mean=NULL,sd=NULL,lambda=NULL,size=NULL,prob=NULL){

  if (distribution=="Normal"){

   x <- rnorm(n=n,mean=mean,sd=sd)

  }

  if (distribution=="Poisson"){

  x <- rpois(n=n, lambda=lambda)

  }

 if (distribution=="Binomial") {

  x <- rbinom(n=n,size=size,prob=prob)

 }

    attributes(x) <- list(distribution = distribution,
                          size = size,
                          prob = prob)
    class(x) <- "MyClass"

  return (x)
}

answer <- random_number_generator(n=10, distribution = "Binomial",size=15,prob=0.4)

summary.MyClass <- function(x) {
    stopifnot(inherits(x, "MyClass"))
    cat("\t\n", 
        sprintf("Sample size: %s\n", length(x)),
        sprintf("Mean: %s\n", mean(x)),
        sprintf("Standard Deviation: %s\n", sd(x)),
        sprintf("Distribution: %s\n", attr(x, "distribution")),
        sprintf("Size: %s\n", attr(x, "size")),
        sprintf("Prob: %s\n", attr(x, "prob"))
        )
}

summary(answer)
0 голосов
/ 16 января 2019

Мы могли бы сделать следующее:

random_number_generator <- function(n, distribution, mean = NULL, sd = NULL, lambda = NULL, size = NULL, prob = NULL) {
  if (distribution == "Normal")
    x <- rnorm(n = n, mean = mean, sd = sd)
  else if (distribution == "Poisson")
    x <- rpois(n = n, lambda = lambda)
  else if (distribution == "Binomial")
    x <- rbinom(n = n, size = size, prob = prob)
  out <- list(x = x, distribution = distribution, size = size, prob = prob)
  class(out) <- "MyClass"
  out
}

summary.MyClass <- function(obj) {
  stopifnot(inherits(obj, "MyClass"))
  cat("\t\n", 
      sprintf("Sample size: %s\n", length(obj$x)),
      sprintf("Mean: %s\n", mean(obj$x)),
      sprintf("Standard Deviation: %s\n", sd(obj$x)),
      sprintf("Distribution: %s\n", obj$distribution),
      sprintf("Size: %d\n", obj$size),
      sprintf("Probability: %s\n", obj$prob)
  )
}

answer <- random_number_generator(n = 10, distribution = "Binomial", size = 15, prob = 0.4)
summary(answer)
#   
#  Sample size: 10
#  Mean: 5.5
#  Standard Deviation: 1.64991582276861
#  Distribution: Binomial
#  Size: 15
#  Probability: 0.4

Итак, чтобы вернуть дополнительную информацию, нам нужно сохранить эту дополнительную информацию в качестве вывода из random_number_generator, что я сделал с

out <- list(x = x, distribution = distribution, size = size, prob = prob)
class(out) <- "MyClass"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...