0

我正在尝试重现以下代码(nls 函数表现不佳),但通过额外的实现,使用 for 循环、sprintf 和 as.formula(),根据给定光谱中的峰值数量添加变量。为了在峰之间更加连贯,我对每个峰的变量名称进行了矢量化,因此峰号 1 具有与之相关的“alfa [1]”、“峰 [1]”和“高度 [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_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."
于 2014-01-30T13:39:50.530 回答
0

alfa如果我理解正确的话,您希望使用诸如此类的向量来存储多个值。也许您应该尝试将这些向量组合在一个列表中,这使它们更易于访问。

将这个列表命名为 not 应该是个好主意par

据我了解你的问题,你有不止一个高峰要处理。所以你有这样的数据:

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

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

还是我错过了你问题的重点?

于 2014-01-30T14:11:17.117 回答