2016-10-02 2 views
0

私は次の関数で変数vindを上書きすることができますどのようにお願いしたいと思います:Rのリファレンスで変数を渡すには?

repcomb <- function(v,n,ind) 
{ 
    k <- length(v) 
    if(ind == 0) 
    { 
     for (i in 1:k) v[i] <- 1 
     ind <- 1 
     return 
    } 
    for (i in k:1) 
    { 
     if(v[i] != n) 
     { 
     for (j in k:i) v[j] <- v[i] + 1 
     return 
     } 
    } 
    ind = 0 
} 

vindを更新するための最も簡単な方法は何ですか?

+0

1)あなたは何をしようとしていますか? 2) 'i + 1:k'は' i +(1:k) 'として解析されます。おそらく '(i + 1):k'を意味するでしょう。 –

+0

ありがとうございます。それはforループの本当に簡単な実装です。 i + 1:kの唯一の現実的な解釈は(i + 1):kなので、なぜ私はそれが著者によって書かれたのか理解していない。 – TobiR

+0

あなたはその質問に答えなかった。あなたは何をしようとしていますか? –

答えて

1

これが最も簡単な方法です:

repcomb <- function(v,n,ind) 
{ 
    k <- length(v) 
    if(ind == 0) 
    { 
    for (i in 1:k) v[i] <- 1 
    ind <- 1 
    return(list(v=v, ind=ind)) 
    } 
    for (i in k:1) 
    { 
    if(v[i] != n) 
    { 
     for (j in i+1:k) v[j] <- v[i] + 1 
     v[i] <- v[i] + 1 
     return(list(v=v, ind=ind)) 
    } 
    } 
    ind = 0 
    return(list(v=v, ind=ind)) 
} 

res <- repcomb(1:5, 4, 2) 
v <- res$v 
ind <- res$ind 
+0

ありがとうございました!私は何かを誤解しましたか?私は呼び出し関数を実装しましたが、実行中に何らかのエラーがあります。関数repの出力には、ベクトル "1 1 1"、 "1 1 2"、 "1 2 2"、および "2 2 2"が含まれている必要があります。 担当者< - N()関数 { < - 2 V < - ベクトル(モード= "整数"、長さ= 3) IND < - 0 繰り返し { RP < - repcomb(V、N、 IND) V < - RPの$のV IND < - あなたが返す必要があるので、実際にあなたは、あなたの関数に複数のreturn文をRPます$ IND 場合(IND == 0) プリント(V) } } – TobiR

+0

を破るを持っています複数の場所から、代わりにただ一つの場所から戻ることです。 –

0

あなたが関数内で設定されたパラメータの値を取り戻すしたい場合は、例えば、eval.parent(substitute(val<-new_val))を使用することができます。

f_sqr <- function(val){ 
    new_val <- val^2 
    eval.parent(substitute(val<-new_val)) 
} 

あなたの場合それを呼び出す:

val <- 5 
f_sqr(val) 
val 
#[1] 25 

パラメータの値を変更しないでください。代わりに、新しい変数にコピーし、コード内で何をしたいのかを行い、最後に新しい変数の値をパラメータ変数に設定します。独自の機能については

、これはあなたの最初のifのために何をすべきかです:

repcomb <- function(v, n, ind) 
{ 
    k <- length(v) 
    if (ind == 0) 
    { 
     new_v <- v 
     for (i in 1:k) new_v[i] <- 1 
     # ind <- 1 
     new_ind <- 1 
     eval.parent(substitute(ind<-new_ind)) 
     eval.parent(substitute(v<-new_v)) 
    } 
} 

あなたはそれを呼び出す場合はその後、変更を取り戻すます:

に対応し
v <- 1:5 
n <- 3 
ind <- 0 
repcomb(v, n, ind) 
v 
#[1] 1 1 1 1 1 
ind 
#[1] 1 

、他の部分はあなたが望むものに合うように変更することができます。

+0

@TobiR私の答えはあなたの問題を解決していませんでしたか? – 989

+0

このプログラミングパターンを避けてください。常に安全ではなく、良いプログラミングスタイルではありません。このような状況では、他のレスポンスによって提案されたように、リスト内の新しい値を簡単に返すことができ、より洗練されたコードになります。特別な場合には、環境を渡すこともできます(環境はその場で変更できます)。これにより、パフォーマンスが向上する場合もありますが、安全ですが、あまり読みにくくない場合もあります。 –

+0

@TomasKaliberaそれはどうやってコード化するのではなく、むしろOPのように思っています。 – 989

関連する問題