Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 删除数据框中的行并使其跨函数工作-引用变量?_R_Pointers_Dataframe - Fatal编程技术网

R 删除数据框中的行并使其跨函数工作-引用变量?

R 删除数据框中的行并使其跨函数工作-引用变量?,r,pointers,dataframe,R,Pointers,Dataframe,我正在R中创建一个21点模拟器,遇到了一个意想不到的问题。在hit函数中,我想从卡组中移除一张卡,该卡存储为数据帧。但是,删除是有效的,在其他函数中识别新减少的数据帧是不起作用的。换句话说,当我调用hit函数并传递数据帧deck时,就会传递deck的副本 我认为这可以通过使用引用变量或指针来处理,但我没有在网上看到关于R的太多讨论。同样,在甲板上使用全局变量也可以,但我知道这不是很流行 从hit函数执行printstrdeck行时,数据帧由51个正确的对象组成。然后从主函数执行时,它包含52个对

我正在R中创建一个21点模拟器,遇到了一个意想不到的问题。在hit函数中,我想从卡组中移除一张卡,该卡存储为数据帧。但是,删除是有效的,在其他函数中识别新减少的数据帧是不起作用的。换句话说,当我调用hit函数并传递数据帧deck时,就会传递deck的副本

我认为这可以通过使用引用变量或指针来处理,但我没有在网上看到关于R的太多讨论。同样,在甲板上使用全局变量也可以,但我知道这不是很流行

从hit函数执行printstrdeck行时,数据帧由51个正确的对象组成。然后从主函数执行时,它包含52个对象。我希望从现在起能识别出包含51个对象的数据帧

这是代码。您可以运行Main函数,它将生成我讨论的所有内容:

Main <- function()
{
  setDir()

  deck <- createDeck()
  hit(deck)
  print(str(deck))

}

hit <- function(deck)
{
  randomNum <- sample(nrow(deck),1) #Row index in data frame of card to be dealt
  card <- deck[randomNum,]
  deck <- deck[-randomNum,]

  print(card)  
  print(str(deck))
}

createDeck <- function(totalNumOfDecks = 1)
{
  suits <- c("Diamonds", "Clubs", "Hearts", "Spades")
  cards <- c("Ace", "Deuce", "Three", "Four","Five", 
             "Six", "Seven", "Eight", "Nine", "Ten", 
             "Jack", "Queen", "King")
  values <- c(0,2,3,4,5,
              6,7,8,9,10,
              10,10,10)

  deck <- data.frame(Suit=character(0), Card=character(0), Value=numeric(0))

  numOfDecks = 1

  while (numOfDecks <= totalNumOfDecks){
    for (i in suits){
      for (j in cards){
        deck <- rbind.data.frame(deck, cbind.data.frame(j, i, values[match(j, cards)]))
      }
    }
    numOfDecks = numOfDecks + 1
  }

  colnames(deck) <- c("Card", "Suit", "Value")

  return (deck)
}

setDir <- function()
{
  setwd("/Users/michaelsankari/Documents/Trading & Investment/Ideas & Analysis/Blackjack")
}

谢谢。

您可能只是想让hit实际返回修改后的deck版本,因此在主要情况下,如果您在hit中修改deck,它将不会在函数之外修改,请参见例如。您可以使用@joran修改函数中的全局变量,这是一针见血!我对R比java更熟悉。我的想法是编写一个21点模拟器来加速我的java学习。然而,这对我来说太复杂了,我想先用R写它会更容易,只是为了得到结构。你的观点是让我觉得,从一开始就用java编写它会让我感觉更好。至于你的hit return the deck的意思,hit的想法是把发牌的牌退回。如果你的最终目标是Java的成品,那么R将是一个非常糟糕的原型开发环境。它使用了一种完全不同的范式。让我退一步问一个更大的问题。如果您正在构建一个21点模拟器,并且可以在用R或Java编写它之间进行选择,您会选择哪种语言?