R gsub中的反向参考评估时间
我正在尝试生成组合n个高斯数的函数,并使用从R gsub中的反向参考评估时间,r,evaluation,gsub,R,Evaluation,Gsub,我正在尝试生成组合n个高斯数的函数,并使用从nls运行中检索到的值。我使用gsub将原始系数替换为使用反向引用的nls系数。但是,datafame上的[似乎在\\1之前计算 这里是一个MWE: nls <- data.frame(Estimate = seq(1,3)) row.names(nls) <- c("a","b","c") gsub("(a|b|c)",paste0(" ",nls["\\1","Estimate"]," "),"a + b*x + c*x^2") 有没
nls
运行中检索到的值。我使用gsub
将原始系数替换为使用反向引用的nls
系数。但是,datafame上的[
似乎在\\1
之前计算
这里是一个MWE:
nls <- data.frame(Estimate = seq(1,3))
row.names(nls) <- c("a","b","c")
gsub("(a|b|c)",paste0(" ",nls["\\1","Estimate"]," "),"a + b*x + c*x^2")
有没有推迟评估[
的想法
谢谢
编辑:为了清楚起见,下面是一个功能强大的完整函数(它将峰值数、一个峰值的公式、公式中的参数、变量、常量布尔值和nls结果作为参数,并返回公式供ggplot
的stat\u function()
使用:
Generate_func1)gsub
将模式替换为常数,但您要做的是将其替换为将函数应用于匹配字符串的结果。gusbfn
中的公式就是这样做的。下面,第二个参数中的公式只是gsubfn的缩写形式,用于参数为左侧和主体的函数是右侧。或者,第二个参数可以用常用的函数表示法(function(x)nls[x,]
)表示,但要牺牲一些细节:
> library(gsubfn)
> gsubfn("a|b|c", x ~ nls[x, ], "a + b*x + c*x^2")
[1] "1 + 2*x + 3*x^2"
请注意,“a | b | c”
可以使用paste(行名(nls),collapse=“|”)
从nls
派生,以避免冗余规范
2)虽然gsubfn
大大简化了这一过程,但如果不使用gsubfn
则使用替换
:
> L <- as.list(setNames(nls[[1]], rownames(nls))) # L <- list(a = 1L, b = 2L, c = 3L)
> e <- parse(text = "a + b * x + c * x ^ 2")[[1]] # e is the text as a "call" object
> s <- do.call(substitute, list(e, L)) # perform the substitution
> format(s) # convert to character
[1] "1L + 2L * x + 3L * x^2"
3)另一种可能是在要替换的字符串上循环
> s <- "a + b*x + c*x^2"
> for(nm in rownames(nls)) s <- gsub(nm, nls[nm, ], s)
> s
[1] "1 + 2*x + 3*x^2"
>s用于(行名中的nm(nls))s
[1] “1+2*x+3*x^2”
如果我们知道每次更换的次数不超过一次,我们可以使用sub
代替gsub
更新:更正了第二个解决方案
更新2:添加了第三种解决方案。这里有另一种方法
gsub(paste0(row.names(nls), "(.*)", collapse=""), paste0(t(nls), paste0("\\", 1:nrow(nls)), collapse=""), "a + b*x + c*x^2" )
[1] "1 + 2*x + 3*x^2"
非常感谢,我不能使用第二个方案,因为我的原始版本有点复杂。在对完整版本进行更广泛的测试后,我将接受您的答案(明天)。再次感谢!我已经更新了代码来计算L
,以显示它如何从nls
中导出。并且进一步更新了代码,以显示如果将二次型表示为字符串,如何执行此操作。我真的需要感谢您!第一个解决方案在我复杂的情况下非常有效。我添加了完整的函数来说明为什么要使用其他选项无法工作。感谢您的输入,但是gsubfn
解决方案更适合我的特定问题。
> L <- as.list(setNames(nls[[1]], rownames(nls))) # L <- list(a = 1L, b = 2L, c = 3L)
> e <- parse(text = "a + b * x + c * x ^ 2")[[1]] # e is the text as a "call" object
> s <- do.call(substitute, list(e, L)) # perform the substitution
> format(s) # convert to character
[1] "1L + 2L * x + 3L * x^2"
nls[[1]] <- as.numeric(nls[[1]])
> s <- "a + b*x + c*x^2"
> for(nm in rownames(nls)) s <- gsub(nm, nls[nm, ], s)
> s
[1] "1 + 2*x + 3*x^2"
gsub(paste0(row.names(nls), "(.*)", collapse=""), paste0(t(nls), paste0("\\", 1:nrow(nls)), collapse=""), "a + b*x + c*x^2" )
[1] "1 + 2*x + 3*x^2"