0

次のコードを再現しようとしています ( nls 関数はうまく機能しません) が、for ループ、sprintf、および as.formula() を使用して追加の実装を行い、特定のスペクトルのピーク数に応じて変数を追加します。ピーク間で一貫性を持たせるために、各ピークの変数名をベクトル化したので、ピーク番号 1 には関連する 'alfa[1]'、'peak[1]'、'height[1]' があります。

これまでのところ、期待される式が得られました。

height[1]/(pi*alfa[1]*(1+((x-peak[1])/alfa[1])^2))+height[2]/(pi*alfa[2]*(1+((x-peak[2])/alfa[2])^2))+drift.a+drift.b*x

parそれにもかかわらず、同じシステムを回線に複製しようとすると、いくつかの問題が発生します。次のように表示されます。

par=c(alfa[1]=0.001,
      peak[1]=2.156460,
      height[1]=1,
      alfa[2]=0.001,
      peak[2]=2.170150,
      height[2]=1, 
      drift.a=0, 
      driftb=0)

しかし、代わりに、すべての文字列を折りたたんでas.formula後でコマンドを使用すると、次のようになりました。

Error en parse(text = x) : <text>:1:15: unexpected '='
1: par=c( alfa[1]=
                  ^

折りたたんだ文字列を出力すると文字列は想定通りなので、どうにかして as.formula コマンドに繋げられるのではないかと考えています(つまり、流用されたコマンドではないかもしれません)

4

2 に答える 2

1

を使用して名前付きベクトルを作成する場合c、名前は有効な変数名であるか、引用符で囲む必要があります。

これで結構です:

c(alfa1 = 0.001)
## alfa1 
## 0.001

alfa[1]は有効な変数名ではありません – 変数の最初の要素です – したがって、引用符で囲む必要があります:

c(alfa1[1] = 0.001)
## Error: unexpected '=' in "c(alfa1[1] ="

c("alfa1[1]" = 0.001)
## alfa1[1] 
##    0.001

逆引用符も機能します。

c(`alfa1[1]` = 0.001)
## alfa1[1] 
##    0.001

パッケージもご覧くださいis_valid_variable_nameassertive

library(assertive)
is_valid_variable_name(c("alfa1", "alfa[1]"))
##   alfa1 alfa[1] 
##    TRUE   FALSE

次を使用して、係数名を有効な変数名に変換できますmake.names

make.names("alfa[1]")
## [1] "alfa.1."
于 2014-01-30T13:39:50.530 に答える
0

alfa私があなたを正しく理解していれば、いくつかの値を格納するためになどのようなベクトルが必要です。このベクトルをリストにまとめてみると、アクセスしやすくなります。

そして、このリストの名前をpar.

あなたの質問を理解する限り、処理するピークが複数あります。したがって、次のようなデータがあります。

peak <- c(2.31, 3.17, ...)
alfa <- c(0.001, 0.002, ...)

この場合、 を使用list(peak = peak, ...)して、すべてのパラメーターを含むリストを作成し、関数を呼び出して、リストから適切なオブジェクトを提供できます。

それとも、あなたの質問の要点を見逃していましたか?

于 2014-01-30T14:11:17.117 に答える