2016-05-06 14 views
2

Ich habe die folgende Python-Funktion,Konvertieren von Python-Funktion in R Funktion

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') 

Die folgende Ausgabe ist,

[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] 

Ich muss das R konvertieren, aber ich verstehe, gibt es keine Entsprechung Python list.pop Funktion in R. ich bin nicht besorgt über Zufallsprinzip aus, wie ich ein rep in R tun kann, und bin in der Lage durch die Zeichnung von Karte in R zu emulieren,

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

Auch ich kann die gleiche gezogene Karte um head(deck, -1) entfernen, aber ich weiß nicht, wie man die 2 in 1 Funktion wie in Python füttert, die sowohl den Kartenwert als auch das kürzere Deck zurückgibt.

Bitte helfen.

Danke, Lobbie

+1

R macht meistens keine In-Place-Mutation; d. h. eine Funktion ändert kein Objekt, sondern gibt stattdessen eine Version dieses Objekts zurück, mit der sie überschrieben werden kann. Die R-esqe-Version von 'list.pop' wäre zweimal zu unterteilen. Siehe 'Beispiel 'zum Mischen. – alistaire

Antwort

1
antworten

Ich schlage nicht vor, dass Sie das tun (eine Liste der Karte und das neue Deck ist eine bessere Idee der Rückkehr), aber Sie können die globalen deck Variable wie so die Funktion verändern haben:

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 

Für Zufall Sampling (Danke an Ben Bolker) und eine Funktion, die mit jeder Deckvariable funktioniert:

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) 
} 
+2

Dies sollte nicht 'head/tail' sein, um der Frage von OP zu entsprechen, sollte es so etwas wie' s

+0

Hallo CactusWoman und Ben, eine meiner Ideen war es, eine weitere ReDeck-Funktion für Head (Deck, -1) zu erstellen, die nach DrawCard() aufgerufen wird, aber beide Vorschläge sind gut und mit Bens, Ich kann tatsächlich zufällig ziehen, denke ich. werde es ausprobieren und dich wissen lassen, wie ich gehe. Vielen Dank. – Lobbie

+0

Hallo nochmal, danke und beide Antworten haben funktioniert! – Lobbie

1

Mit Ihrer Logik zurück, wie list

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

cc<-1:10 
DrawCard(cc) 

Eine bessere Logik

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

Appended: loop

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) 

} 
+0

danke, aber diese Funktion ist in einer Schleife und der Kartenwert wird für die Summierung verwendet und das verbleibende Deck wird immer wieder zum Zeichnen verwendet werden, so bin ich mir nicht sicher, eine Liste wird hier nützlich sein. Vielen Dank für Ihre Antwort. – Lobbie

+1

Ich möchte nicht herausfinden, ob der Algorithmus korrekt ist oder nicht. aber es ist machbar. Siehe meine angehängte Antwort. – Ananta

+0

danke, Ananta und ja, es ist definitiv machbar. Die obigen Antworten von CatusWoman und Ben sind einfacher und entsprechen meinen Bedürfnissen. Danke noch einmal. – Lobbie