将Python函数转换为R函数

时间:2016-05-06 14:57:45

标签: python r

我有以下Python函数,

import random
import math

deck = [2,3,4,5,6,7,8,9,10,10,10,10,11]

def draw_card(deck):
        card = deck.pop(random.sample(range(len(deck)), 1)[0])
        return(card)

print(deck,'\n')
my_draw = draw_card(deck)
print(my_draw, '\n')
print(deck, '\n')

输出低于,

[2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11] 

3 

[2, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11] 

我需要将它转换为R但我知道R中没有等效的Python list.pop函数。我不担心随机选择,因为我可以在R中执行rep并且能够模拟在R by中绘制卡片,

DrawCard <- function(card){
  card <- tail(deck,1)
  return(card)
}

此外,我可以通过head(deck, -1)移除相同的抽取卡,但我不知道如何提供像Python一样的2合1函数,它将同时返回卡值和较短长度的卡片。

请帮忙。

谢谢, Lobbie

2 个答案:

答案 0 :(得分:1)

根据您的逻辑,返回list

DrawCard <- function(deck){
  card <- tail(deck,1)
  remain<-head(deck,9)
  return(list(card,remain))
}

cc<-1:10
DrawCard(cc)

更好的逻辑可能是,

DrawCard <- function(deck){
  ind<-1:length(deck)
  choose<-sample(ind,1)
  card<-deck[choose]
  remain<-deck[-choose]
  return(list(card,remain))
}

附加:回答循环

sum=0
ll<-length(cc)
deck_rem<-cc
for(x in 1:ll){

  a<-DrawCard(deck_rem)
  deck_rem=a[[2]]
  sum=sum+a[[1]]
  print(a[[1]])
  print(a[[2]])
  print(sum)

}

答案 1 :(得分:1)

我不是建议你这样做(返回卡片列表和新牌组是一个更好的主意),但你可以让函数改变全局deck变量,如下所示:

draw_card <- function(deck){
  card <- tail(deck,1)
  deck <<- head(deck, length(deck)-1)
  return(card)
}

print(deck)
# [1]  2  3  4  5  6  7  8  9 10 10 10 10 11

print(draw_card(deck))
# [1] 11

print(deck)
#  [1]  2  3  4  5  6  7  8  9 10 10 10 10

随机抽样(感谢Ben Bolker)和一个适用于任何套牌变量的函数:

draw_card <- function(deck){
  s <- sample(length(deck),size=1)
  card <- deck[s]
  n <- deparse(substitute(deck))
  assign(n, deck[-s], envir=globalenv())
  return(card)
}