R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Ajatusten lukua R:llä

R-listoilla nähtyjä ”repäisyjä” keräävä fortunes-laajennuspaketti sisältää mm. seuraavan:

library(fortunes)
fortune(182)
Brian Ripley: Where did you tell it [...]? (Nowhere: R is lacking a mind_read() function!)
Peter Dalgaard: Please stop complaining about missing features. Patches will be considered.

Oh, it's you, Brian. Never mind then. You'll get to it, I'm sure. ;-)
   -- Brian Ripley and Peter Dalgaard (answering why abline(lm(x~y)) would not work)
      R-help (January 2007)

R:ssä ei siis ole ajatusten lukemiseen soveltuvaa pakettia. Seuraavassa esitellään kaksi funtiota, jotka parantavat asiaa, joskaan niitä ei ole paketoitu.

Ensinnäkin tarvitaan funktio, joka jää odottamaan käyttäjän syötettä, ja sellainen on readInput():

readInput <- function() {
   system("stty -echo")
   a <- readline()
   system("stty echo")
   cat("\n")
   return(a)
}

En enää muista mistä olen funktion alunperin kopioinut, mutta sen tuntuu toimivan uusimmassakin R-versiossa (2.15.1).

Seuraavat kaksi funktiota implementoivat luvuilla tai pelikorteilla tapahtuvat taikatemput, joiden avulla yritetään uskotella katsojille tai käyttäjille, että taikuri osaa lukea ajatuksia. Tässä tapauksessa taikurin virkaa ajaa siis R.

Tämä ensimmäinen toimii luvuilla yhdestä yhdeksään:

readMindNumber<-function() {
   cat("THIS IS A MIND READER.\n\n")
   cpucard<-sample(1:9, 1)
   cpusubtract<-10-cpucard
   cat("Take a deck of playing cards, and pick a card with the value between 1 and 9.\n")
   cat("Then, follow the instructions below.\n\n")
   cat("1. Double the value of the card.\n")
   cat("2. Add two to the result.\n")
   cat("3. Multiply the result by five.\n")
   cat(paste("4. Subtract", cpusubtract, "from the result.\n\n", sep=" "))
   cat("What is the number you end up with?\n\n")
   b<-readInput()
   if(b<11 | b>99) {
      stop("Please, check your math! That's an impossible result.\n")
   }
   yourcard<-substr(as.character(b), 1, 1)
   cat(paste("I think the card you selected was ", yourcard, ".\n", sep=""))
}

Ja tämä toinen puolestaan pyytää valitsemaan yhden pelikortin:

readMindCard<-function() {
  cat("THIS IS A MIND READER.\n\n")
  cat("Take a deck of playing cards, and pick any card.\n")
  cat("Then, follow the instructions below.\n\n")
  cat("1. Double the number on the card.\n")
  cat("2. Add three to the new number.\n")
  cat("3. Multiply the number by five.\n")
  cat("4. Depending on the suit of your card, do one of the following:\n")
  cat("   a. Diamond -> Add one to the number.\n")
  cat("   b. Club    -> Add two to the number.\n")
  cat("   c. Heart   -> Add three to the number.\n")
  cat("   d. Spade   -> Add four to the number.\n\n")
  cat("What is the number you end up with?\n\n")
  b<-readInput()
  result<-as.numeric(b)-15
  if(nchar(result)==2) {
     number<-substr(as.character(result), 1, 1)
     suitn<-as.numeric(substr(result, 2, 2))
  }
  if(nchar(result)==3) {
     number<-substr(as.character(result), 1, 2)
     suitn<-as.numeric(substr(result, 3, 3))
  }
  if(suitn==1) {
     suit<-"diamonds"
  }
  if(suitn==2) {
     suit<-"clubs"
  }
  if(suitn==3) {
     suit<-"hearts"
  }
  if(suitn==4) {
     suit<-"spades"
  }
  cat(paste("I think your card was ", number, " of ", suit, ".\n", sep=""))
}

Funktioita käytetään yksinkertaisesti kutsumalla niitä ilman argumentteja:

readMindNumber()
 
readMindCard()

Tämän jälkeen R arvaa valitsemasi kortin, kunhan kerrot sille ohjeiden perusteella tehdyn laskutoimituksen tuloksen. Esimerkiksi, jos valitse kortiksi ruutu ysin:

readMindCard()
 
THIS IS A MIND READER.
 
Take a deck of playing cards, and pick any card.
Then, follow the instructions below.
 
1. Double the number on the card.
2. Add three to the new number.
3. Multiply the number by five.
4. Depending on the suit of your card, do one of the following:
   a. Diamond -> Add one to the number.
   b. Club    -> Add two to the number.
   c. Heart   -> Add three to the number.
   d. Spade   -> Add four to the number.
 
What is the number you end up with?
 
106
 
I think your card was 9 of diamonds.


Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *