Associated Material

Zoom notes: Module 08 - Functions and Choices

Readings:


Topics

User-Defined Functions

  • Declaration
  • Input arguments
  • Returning a result

Scope

Flow of Control

  • Types
  • Conditional execution (branching)
  • if, else, and else if
  • Comparison operators
  • Boolean logic operators
  • Complex conditionals

Exercise

Even seemingly simple programs can involve elaborate flow of control. The simple game Rock, Paper, Scissors (https://www.wikihow.com/Play-Rock,-Paper,-Scissors) can be implemented with a complex conditional structure. Write a function to play the game.

In the example solution below, we use the R function sample to randomly select a move for each of two players (https://www.rdocumentation.org/packages/base/versions/3.6.2/topics/sample). Alternatively, the players’ choices could be passed in as input arguments.

Note that there are many ways that the conditional logic can be implemented, so your solution may be different. The general rule is that we try to keep our conditional logic as succinct as possible, while still making it easy for someone reading your code to understand.


rock_paper_scissors <- function()
{
  # Vector of the three possible moves
  moves <- c("rock", "paper", "scissors")
  
  # Randomly select a move for Bob
  bob_move <- sample(moves,1)
  
  # Randomly select a move for Fred
  fred_move <- sample(moves,1)
  
  
  # Work through the game win conditions
  if (bob_move == fred_move){
    winner = "draw"
  }
  
  if( bob_move == "rock"){
    if (fred_move == "paper"){
      winner = "fred"
    }
    if (fred_move == "scissors"){
      winner = "bob"
    }
      
  }
  
  if (bob_move == "paper"){
    if (fred_move == "rock"){
      winner = "bob"
    }
    if (fred_move == "scissors"){
      winner = "fred"
    }
  }
  
  if (bob_move == "scissors") {
    if (fred_move == "rock"){
      winner = "fred"
    }
    if (fred_move == "paper"){
      winner = "bob"
    }
  }
  
  # Return the winner
  return(winner)
} # end rock_paper_scissors
LS0tCnRpdGxlOiAiWm9vbSBOb3RlcyAwODogRnVuY3Rpb25zIGFuZCBDaG9pY2VzIgpkYXRlOiAiU2VtZXN0ZXIgMiwgMjAyMyIKb3V0cHV0OgogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdG9jX2RlcHRoOiAzCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCiAgICBjb2RlX2ZvbGRpbmc6IHNob3cKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KbGlicmFyeShrbml0cikKCmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBjb21tZW50ID0gIiM+IiwKICBmaWcucGF0aCA9ICJmaWd1cmVzLzA4LyIsICMgdXNlIG9ubHkgZm9yIHNpbmdsZSBSbWQgZmlsZXMKICBjb2xsYXBzZSA9IFRSVUUsCiAgZWNobyA9IFRSVUUKKQpgYGAKCj4gIyMjIyBBc3NvY2lhdGVkIE1hdGVyaWFsCj4KPiBab29tIG5vdGVzOiBbTW9kdWxlIDA4IC0gRnVuY3Rpb25zIGFuZCBDaG9pY2VzXSgwOC1mdW5jdGlvbnMuaHRtbCkKPiAKPiBSZWFkaW5nczoKPgo+IC0gW1IgZm9yIERhdGEgU2NpZW5jZSAtIENoYXB0ZXIgMTldKGh0dHBzOi8vcjRkcy5oYWQuY28ubnovZnVuY3Rpb25zLmh0bWwpCgpcCgojIFRvcGljcwoKIyMgVXNlci1EZWZpbmVkIEZ1bmN0aW9ucwoKLSAgRGVjbGFyYXRpb24KLSAgSW5wdXQgYXJndW1lbnRzCi0gIFJldHVybmluZyBhIHJlc3VsdAoKIyMgU2NvcGUKCiMjIEZsb3cgb2YgQ29udHJvbAoKLSAgVHlwZXMKLSAgQ29uZGl0aW9uYWwgZXhlY3V0aW9uIChicmFuY2hpbmcpCi0gIGlmLCBlbHNlLCBhbmQgZWxzZSBpZgotICBDb21wYXJpc29uIG9wZXJhdG9ycwotICBCb29sZWFuIGxvZ2ljIG9wZXJhdG9ycwotICBDb21wbGV4IGNvbmRpdGlvbmFscwoKIyMgRXhlcmNpc2UKCkV2ZW4gc2VlbWluZ2x5IHNpbXBsZSBwcm9ncmFtcyBjYW4gaW52b2x2ZSBlbGFib3JhdGUgZmxvdyBvZiBjb250cm9sLiBUaGUgc2ltcGxlIGdhbWUgUm9jaywgUGFwZXIsIFNjaXNzb3JzIChodHRwczovL3d3dy53aWtpaG93LmNvbS9QbGF5LVJvY2ssLVBhcGVyLC1TY2lzc29ycykgY2FuIGJlIGltcGxlbWVudGVkIHdpdGggYSBjb21wbGV4IGNvbmRpdGlvbmFsIHN0cnVjdHVyZS4gV3JpdGUgYSBmdW5jdGlvbiB0byBwbGF5IHRoZSBnYW1lLiAKCkluIHRoZSBleGFtcGxlIHNvbHV0aW9uIGJlbG93LCB3ZSB1c2UgdGhlIFIgZnVuY3Rpb24gYHNhbXBsZWAgdG8gcmFuZG9tbHkgc2VsZWN0IGEgbW92ZSBmb3IgZWFjaCBvZiB0d28gcGxheWVycyAoaHR0cHM6Ly93d3cucmRvY3VtZW50YXRpb24ub3JnL3BhY2thZ2VzL2Jhc2UvdmVyc2lvbnMvMy42LjIvdG9waWNzL3NhbXBsZSkuIEFsdGVybmF0aXZlbHksIHRoZSBwbGF5ZXJzJyBjaG9pY2VzIGNvdWxkIGJlIHBhc3NlZCBpbiBhcyBpbnB1dCBhcmd1bWVudHMuIAoKTm90ZSB0aGF0IHRoZXJlIGFyZSBtYW55IHdheXMgdGhhdCB0aGUgY29uZGl0aW9uYWwgbG9naWMgY2FuIGJlIGltcGxlbWVudGVkLCBzbyB5b3VyIHNvbHV0aW9uIG1heSBiZSBkaWZmZXJlbnQuIFRoZSBnZW5lcmFsIHJ1bGUgaXMgdGhhdCB3ZSB0cnkgdG8ga2VlcCBvdXIgY29uZGl0aW9uYWwgbG9naWMgYXMgc3VjY2luY3QgYXMgcG9zc2libGUsIHdoaWxlIHN0aWxsIG1ha2luZyBpdCBlYXN5IGZvciBzb21lb25lIHJlYWRpbmcgeW91ciBjb2RlIHRvIHVuZGVyc3RhbmQuCgoKYGBge3Igcm9ja19wYXBlcl9zY2lzc29yc30KCnJvY2tfcGFwZXJfc2Npc3NvcnMgPC0gZnVuY3Rpb24oKQp7CiAgIyBWZWN0b3Igb2YgdGhlIHRocmVlIHBvc3NpYmxlIG1vdmVzCiAgbW92ZXMgPC0gYygicm9jayIsICJwYXBlciIsICJzY2lzc29ycyIpCiAgCiAgIyBSYW5kb21seSBzZWxlY3QgYSBtb3ZlIGZvciBCb2IKICBib2JfbW92ZSA8LSBzYW1wbGUobW92ZXMsMSkKICAKICAjIFJhbmRvbWx5IHNlbGVjdCBhIG1vdmUgZm9yIEZyZWQKICBmcmVkX21vdmUgPC0gc2FtcGxlKG1vdmVzLDEpCiAgCiAgCiAgIyBXb3JrIHRocm91Z2ggdGhlIGdhbWUgd2luIGNvbmRpdGlvbnMKICBpZiAoYm9iX21vdmUgPT0gZnJlZF9tb3ZlKXsKICAgIHdpbm5lciA9ICJkcmF3IgogIH0KICAKICBpZiggYm9iX21vdmUgPT0gInJvY2siKXsKICAgIGlmIChmcmVkX21vdmUgPT0gInBhcGVyIil7CiAgICAgIHdpbm5lciA9ICJmcmVkIgogICAgfQogICAgaWYgKGZyZWRfbW92ZSA9PSAic2Npc3NvcnMiKXsKICAgICAgd2lubmVyID0gImJvYiIKICAgIH0KICAgICAgCiAgfQogIAogIGlmIChib2JfbW92ZSA9PSAicGFwZXIiKXsKICAgIGlmIChmcmVkX21vdmUgPT0gInJvY2siKXsKICAgICAgd2lubmVyID0gImJvYiIKICAgIH0KICAgIGlmIChmcmVkX21vdmUgPT0gInNjaXNzb3JzIil7CiAgICAgIHdpbm5lciA9ICJmcmVkIgogICAgfQogIH0KICAKICBpZiAoYm9iX21vdmUgPT0gInNjaXNzb3JzIikgewogICAgaWYgKGZyZWRfbW92ZSA9PSAicm9jayIpewogICAgICB3aW5uZXIgPSAiZnJlZCIKICAgIH0KICAgIGlmIChmcmVkX21vdmUgPT0gInBhcGVyIil7CiAgICAgIHdpbm5lciA9ICJib2IiCiAgICB9CiAgfQogIAogICMgUmV0dXJuIHRoZSB3aW5uZXIKICByZXR1cm4od2lubmVyKQp9ICMgZW5kIHJvY2tfcGFwZXJfc2Npc3NvcnMKYGBgCgo=