par = c(...)中意外的“=”

时间:2014-01-30 12:22:55

标签: r nls par

我正在尝试重现以下代码(nls function does not perform well),但是通过额外的实现,使用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命令(即它可能不是相应的命令)

2 个答案:

答案 0 :(得分: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_name包中的assertive

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

您可以使用make.names

将系数名称转换为有效的变量名称
make.names("alfa[1]")
## [1] "alfa.1."

答案 1 :(得分:0)

如果我理解正确的话,你想让像alfa等矢量存储几个值。也许你应该尝试将这些向量组合在一个列表中,这使它们更易于访问。

将此列表命名为par应该是个好主意。

据我了解您的问题,您需要处理多个峰值。所以你有这样的数据:

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

在这种情况下,您可以使用list(peak = peak, ...)构建包含所有参数的列表,然后调用您的函数并从列表中提供适当的对象。

或者我错过了你问题的要点?