Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R gsub中的反向参考评估时间_R_Evaluation_Gsub - Fatal编程技术网

R gsub中的反向参考评估时间

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") 有没

我正在尝试生成组合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结果作为参数,并返回公式供
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"