我正在尝试重现以下代码(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命令(即它可能不是相应的命令)
答案 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, ...)
构建包含所有参数的列表,然后调用您的函数并从列表中提供适当的对象。
或者我错过了你问题的要点?