Как запретить функции replicate() печатать все результаты в R?

Я новичок в R, и у меня есть небольшая проблема. У меня есть следующий код для моего игрового автомата в R (из «практического программирования с R» от Гаррета Гролемунда.

Когда я использую функцию play() для своего игрового автомата, как вы можете видеть ниже, я получаю одно число, которое говорит мне, сколько я выиграл. Когда я использую следующий код для воспроизведения результата:

slot.mach <- replicate(1000,play())

R печатает все 1000 примеров в моей консоли. Чего я не понимаю, так это того, что когда я использую ту же функцию репликации на моей паре игральных костей, которая также имеет одно число в качестве результата, она не печатает все броски, а вместо этого просто добавляет их как вектор к моему объекту, и я можно сразу использовать qplot (это то, что я хочу и со своим игровым автоматом).

Я, очевидно, не хочу, чтобы все они были напечатаны, так как это занимает много времени и места, и мне не нужно видеть все результаты.

Я предполагаю, что это может иметь какое-то отношение к классу и типу объекта, см. ниже:

[1] "integer"
> typeof(slot.mach)
[1] "double"
> class(slot.mach)
[1] "numeric"
> typeof(roll.dice) 
[1] "integer"
> class(roll.dice)
[1] "integer"

Не знаю, важно ли для вас помочь мне, но вот весь код для моего игрового автомата:

score <- function(symbols) {

#identify case of symbols frequency

 same <- length(unique(symbols)) == 1
 bars <- symbols %in% c("B","BB","BBB")

#get prize

 if (same) {
 payouts <- c("DD" = 100,"7" = 80, "BBB" = 40, "BB" = 25, "B" = 10, "C" = 10, 
 "0" = 0)
 prize <- unname(payouts[symbols[1]])
 } else if (all(bars)){
 prize <- 5
 } else {
  cherries <- sum(symbols == "C")
    prize <- c(0,2,5)[cherries+1]
  } 

#adjust for diamonds

 diamonds <- sum(symbols == "DD")
 prize <- prize*(2^diamonds)


}

Затем я могу воспроизвести функцию:

play <- function() {

 get_symbols <- function() {
 wheel <- c("DD","7","BBB","BB","B","C","0")
 sample(wheel,size=3,replace=TRUE,
       prob=c(0.03,0.03,0.06,0.1,0.25,0.01,0.52))

symbols <- get_symbols()
print(score(symbols))
}

Наконец, я получаю результат печати, поэтому каждая "play()" дает мне номер. Обычно это ноль, иногда небольшая сумма (вероятности вы можете увидеть выше).

вот моя функция игры в кости

roll.dice <- function(){x <- 1:6
y <- c(1/8,1/8,1/8,1/8,1/8,3/8)
dice<-sample(x,size=2,replace=TRUE,prob=y)
sum(dice)}
roll.dice <- replicate(10000,roll.dice())

person JachymDvorak    schedule 23.03.2018    source источник
comment
Ваша функция play здесь неполная. Вы либо пропустили закрывающую скобку для get_symbols, либо для play.   -  person De Novo    schedule 24.03.2018
comment
Да, и еще кое-что... Добро пожаловать в переполнение стека, и хорошая работа, правильно написав свой первый вопрос! Да, важно включить определение определяемых пользователем функций, вызываемых при генерации ошибки. Голосую!   -  person De Novo    schedule 24.03.2018


Ответы (2)


replicate print работает, потому что вы replicate работаете с функцией, которая вызывает print

Измените вызов print на возврат, и вместо этого вы получите массив оценок в объекте, который вы присваиваете возвращаемому значению replicate.

Добавив предполагаемую отсутствующую закрывающую скобку вокруг определения get_symbols, вы получите:

play <- function() {

  get_symbols <- function() {
   wheel <- c("DD","7","BBB","BB","B","C","0")
   sample(wheel,size=3,replace=TRUE,
       prob=c(0.03,0.03,0.06,0.1,0.25,0.01,0.52))
  }
symbols <- get_symbols()
score(symbols)
}

Запустите это с другими вашими функциями, как написано, и когда вы вызовете: roll.dice <- replicate(10000,roll.dice()), вы получите целочисленный вектор длины 10000, содержащий результаты 10000 ролей игральных костей, и ничего не выводится на консоль.

person De Novo    schedule 23.03.2018

Как сказал @DanHall, вы не хотите print своих результатов. Я изменил ваши функции на то, что вы ищете. Небольшое замечание: функции действительно полезны, потому что нам нужно определить их только один раз, и мы можем вызывать их столько раз, сколько захотим, в гораздо более визуально привлекательном виде. Ваша функция get_symbols определяется каждый раз, когда вы запускаете play, и в этом нет необходимости. Вы хотите, чтобы ваш код выглядел так:

score <- function(symbols) {

  #identify case of symbols frequency

  same <- length(unique(symbols)) == 1
  bars <- symbols %in% c("B","BB","BBB")

  #get prize

  if (same) {
    payouts <- c("DD" = 100,"7" = 80, "BBB" = 40, "BB" = 25, "B" = 10, "C" = 10, 
                 "0" = 0)
    prize <- unname(payouts[symbols[1]])
  } else if (all(bars)){
    prize <- 5
  } else {
    cherries <- sum(symbols == "C")
    prize <- c(0,2,5)[cherries+1]
  } 

  #adjust for diamonds

  diamonds <- sum(symbols == "DD")
  prize <- prize*(2^diamonds)

  prize
}
get_symbols <- function() {
  wheel <- c("DD","7","BBB","BB","B","C","0")
  sample(wheel,size=3,replace=TRUE,
         prob=c(0.03,0.03,0.06,0.1,0.25,0.01,0.52))
}
play <- function() {
    symbols <- get_symbols()
    score(symbols)
}
person smanski    schedule 23.03.2018