2012-04-30 14 views
0

は(私は「私を」$ x)が、私はfの値を計算したい実際の値

x = c(1, 2, 3.5, 4, 6, 7.5, 8, 9, 10, 11.5, 12) 
y = c(2.5, 6.5) 
I = split(x, findInterval(x, y)) 
f = function(I$'i', x) { 
     d = pmax(outer(x, I$'i', "-"), 0) 
     colSums(d - d^2/2) 
} 

を想定し、各区間の各値で、その後、私は$どの見つけることができます'i'実際の値は、各区間のf(I $ 'i'、x)の最大値を持ちます。たとえば、私たちが3つの間隔を持つ場合、私の結果はxの3つの値でなければならず、f(I $ 'i'、x)は各間隔で最大です。どのように私はこれらの値を見つけることができますか? さらに、私のコードの各反復において、ベクトルyの値が変化することに言及する必要があります。

私はこのコードを書いたが、私は、各区間内の最大値の実際の値を見つけることができません。

for(i in 0:length(I)-1){ 
    max.value = I$'i'[which.max(f(I$'i', x))] 
} 

と私は、このエラーました:「、I、(外側(XをPMAXで エラー - ")、0): 長さが0のベクトルを他の文字と混在させることはできません。

+0

定義の'f'は私のためにRで動作しません、あなたはRに入っていることを確信していますか? – huon

+1

私は 'I $' i 'は構文エラーだとはっきりと確信しています。数字「i」を文字列に変換するには、(例えば) 'i <-0;私[[i]] '。これは '$ '' 0 ''のようなものですが、ちょっと変わった見た目で、' i'を変数にすることができます。 –

+1

少し違うように、 '0:length(I)-1'は期待通りの出力を与えません:' 0:length(I)-1' = '[1] -1 0 1 2'。 Rがあなたが意図する操作の順序を知るように、ブラケットを入れる必要があります: '0 :(長さ(I)-1)' = '[1] 0 1 2' – huon

答えて

0

問題はリストのi番目の要素のインデックスを作成しようとしています。 、あなたは、インデックス、インデックス、それらを順番に[[..]]表記を使用して、リストを(はず、

> i <- 1 
> I$'i' 
NULL 

は、この問題を解決するには:やっI$'i'は存在しない文字列'i'、に対応するリストの要素を取得しようとしていますすなわちI[[1]] = I$'0'):

> i <- 1 
> I[[i]] 
[1] 1 2 
> I$'0' # to illustrate the indexing 
[1] 1 2 

fがちょうどIへのベクター(というよりも、インデックスを取ることを意図していると仮定すると)、その定義は次のようなものでなければなりません

f = function(vec, x) { 
     d = pmax(outer(x, vec, "-"), 0) 
     colSums(d - d^2/2) 
} 

などループ:あなたは、リストの要素の上に直接反復処理することができます

for (i in 1:length(i)) { 
    max.value = I[[i]][which.max(f(I[[i]], x))] 
} 

注意、あなたは個別にインデックスにそれぞれ1を必要としないので、我々も行うことができます:

for (vec in I) { 
    max.value = vec[which.max(f(vec, x))] 
} 

(各ループmax.valueに上書きされるので、あなたは、あなたが持っているものとわずかに異なる何かをしたいかもしれません。)

+0

ありがとうございました。 –

+0

@ BensorBenyこの回答があなたの質問を解決する場合は、その横にあるチェックマークのアウトラインをクリックして「受け入れ済み」と表示する必要があります。 (あなたは他の質問のためにもそれを行うべきです。) – huon

関連する問題