2016-05-09 10 views
0

Ich arbeite gerade an meiner Masterarbeit (Modell eines evolutionären Vertrauensspiels). Und ich habe ein folgendes Problem. Ich habe mehrere Arten von Investoren und Treuhändern, die gepaart sind, um das Vertrauensspiel zu spielen. Investoren und Treuhänder sind als Vektoren definiert. Ich möchte, dass mein Code (Trust Game) den (global definierten) Investor und Treuhänder benötigt. Sie spielen die Iteration des Trust-Spiels zusammen und dann werden die global definierten Variablen innerhalb des Function-Trust-Spiels aktualisiert. Ich möchte, dass es für jeden Investor \ Trustee funktioniert, der als Argument der Funktion Trustgame verwendet wird. Weißt du wie ich das programmieren könnte? Ich bin mir auch nicht sicher, ob es dir helfen wird, aber ich poste auch meinen Code.Zuweisen eines Wertes zur globalen Variable (und einem Argument einer Funktion aswell) R

#### defining trustees #### 
# [1] honor\abuse 
# [2] information about previous interaction - relevant to investors who buy the information 
# [3] payoff 
# [4] number of interactions 
trustee1 <- c(1,0,0,0) 
#### defining investors #### 
# [1] buy\not buy 
# [2-4] investment decision if buying information in case 1(TH), case 2(TA), case 3(NT) 
# [5] aggregated payoff 
# [6] number of interactions in one generation 
investor1 <- c(1,1,1,1,0,0) 


here is the code for the trust game 

trustgame <- function(investor,trustee) 
{ investordecision <- NULL 
trusteedecision <- trustee[1] 
investor[6] <- investor[6]+1 
trustee[4] <- trustee[4]+1 
if (investor[1]==0) investordecision <- investor[2] 
if (investor[1]==1) 
{ if (trustee[2]==1) investordecision <- investor[2] 
if (trustee[2]==2) investordecision <- investor[3] 
if (trustee[2]==3) investordecision <- investor[4] 
if (trustee[2]==0) investordecision <- rbinom(1,1,0.5) 
} 
if (investordecision==1 && trustee[2]==1) trustee[2] <- 1 
if (investordecision==1 && trustee[2]==0) trustee[2] <- 2 
if (investordecision==0) trustee[2] <- 3 

if (investordecision==1 && trusteedecision==1) 
{trustee[3] <- trustee[3] +3 
investor[5] <- investor[5] + 3 } 
if (investordecision==1 && trusteedecision==0) 
{trustee[3] <- trustee[3] +5 
investor[5] <- investor[5] + 0 } 
if (investordecision==0 && trusteedecision==0) 
{trustee[3] <- trustee[3] +1 
investor[5] <- investor[5] + 1 } 
if (investordecision==0 && trusteedecision==1) 
{trustee[3] <- trustee[3] +1 
investor[5] <- investor[5] + 1 } 

} 
+2

'<< -' wird eine globale Variable in einer Funktion ändern. Achtung. – cory

+0

Ich weiß, aber ich habe mehrere Arten von beiden Treuhändern (trustee1, trustee2, ...) und Investoren (investor1, investor2, ...) und ich möchte diese Änderungen automatisch auf diejenigen durchführen, die derzeit als Argument verwendet werden die Funktion, da ich später eine große Simulation machen werde und ich nicht alles manuell eingeben möchte. – hed0r

+0

'get' und' assign' mit dem 'envir' Argument? Wenn Sie erst einmal mit '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'anfangen, ist es ein gutes Zeichen, dass die Dinge schief laufen. – cory

Antwort

0

Wenn Ihre Eingaben Strings sind, können Sie get und assign verwenden, um die Werte in der globalen Umwelt so zu ändern:

trustee1 <- c(1,0,0,0) 
investor1 <- c(1,1,1,1,0,0) 

trustgame <- function(investor_string,trustee_string){ 
    investor <- get(investor_string, envir = globalenv()) 
    trustee <- get(trustee_string, envir = globalenv()) 
    investordecision <- NULL 
    trusteedecision <- trustee[1] 
    investor[6] <- investor[6]+1 
    trustee[4] <- trustee[4]+1 
    if (investor[1]==0) investordecision <- investor[2] 
    if (investor[1]==1){ 
    if (trustee[2]==1) investordecision <- investor[2] 
    if (trustee[2]==2) investordecision <- investor[3] 
    if (trustee[2]==3) investordecision <- investor[4] 
    if (trustee[2]==0) investordecision <- rbinom(1,1,0.5) 
    } 
    if (investordecision==1 && trustee[2]==1) trustee[2] <- 1 
    if (investordecision==1 && trustee[2]==0) trustee[2] <- 2 
    if (investordecision==0) trustee[2] <- 3 

    if (investordecision==1 && trusteedecision==1){ 
    trustee[3] <- trustee[3] +3 
    investor[5] <- investor[5] + 3 
    } 
    if (investordecision==1 && trusteedecision==0){ 
    trustee[3] <- trustee[3] +5 
    investor[5] <- investor[5] + 0 
    } 
    if (investordecision==0 && trusteedecision==0){ 
    trustee[3] <- trustee[3] +1 
    investor[5] <- investor[5] + 1 
    } 
    if (investordecision==0 && trusteedecision==1){ 
    trustee[3] <- trustee[3] +1 
    investor[5] <- investor[5] + 1 
    } 
    assign(trustee_string, trustee, envir = globalenv()) 
    assign(investor_string, investor, envir = globalenv()) 
} 

trustgame("investor1", "trustee1") 
> investor1 
[1] 1 1 1 1 1 1 
> trustee1 
[1] 1 3 1 1 
+0

Vielen Dank, Sie haben mir eine große Zeit geholfen :) – hed0r

+0

Ich habe noch eine Frage. Da ich die Entwicklung der Bevölkerung der Investoren, die sich mit den Treuhändern treffen, simulieren möchte, musste ich die Bevölkerung der Investoren in der Liste speichern. Ich bemühe mich, die Funktion trustgame für die Elemente (Vektoren) der Liste zu verwenden, in der die Population gespeichert ist. Könnten Sie mir bitte einen Hinweis geben, wie ich mit diesem Thema umgehen soll? Dank – hed0r

+0

@ hed0r Ich habe es geändert, um Investoren und Treuhänder in einer Liste zu verwenden ... https://gist.github.com/corynissen/5526748a7f839a207335cc1db2dd8931 – cory