我想結合產生高斯ň功能,並使用從nls
運行檢索值的評估時間。我用gsub
用反向引用替換原始係數與nls
。但是,數據框上的[
似乎在\\1
之前評估。反向引用在GSUB
這裏是一個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("(a|b|c)",paste0(" ","\\1","Estimate"," "),"a + b*x + c*x^2")
任何想法耽誤評估[
?
謝謝!編輯:爲了清楚起見,這裏是全功能,現在工作很好(它需要峯的數量,一個峯值的公式,公式中的參數,變量,常量布爾值和nls結果作爲參數,並返回在ggplot
的stat_function()
公式的使用:
Generate_func <- function(peakNb,peakForm,peakParams, peakVar, constBool,nls){
res <- as.data.frame(summary(nls)$coefficients, optional = T)
rhs <- strsplit(peakForm, "~")[[1]][[2]]
regex <- paste0("([*+-/\\^\\(\\)[:space:]]|^)(",paste0(peakParams, collapse = "|"),")([*+-/\\^\\(\\)[:space:]]|$)")
exp_names <- paste0(sapply(seq(1,peakNb),function(i){
paste0(sapply(peakParams, function(j){
paste0(j,i)
}))
}))
if(constBool){exp_names <- c("C", exp_names)}
func_text <- paste0(sapply(seq(1,peakNb),function(n){gsubfn(regex, x + y + z ~ paste0(x,res[paste0(y,n),"Estimate"],z), rhs)}), collapse = " + ")
func_text <- paste0(ifelse(constBool,paste0(res["C","Estimate"]," + "),""), func_text)
func <- function(x){
eval(parse(text = func_text))
}
names(formals(func)) <- c(peakVar)
print(func_text)
func
}
這裏是一個使用實例(不包括對長緣故NLS數據):
> testfunc <- Generate_func(3, "intensity_cnt ~ a * exp((-(energy_eV-b)^2)/(2*c^2))", c("a","b","c"), "energy_eV", constBool = T, testnls)
[1] "1000 + 32327.6598743022 * exp((-(energy_eV-1.44676439236578)^2)/(2*0.0349194350021539^2)) + 10000 * exp((-(energy_eV-1.49449385009962)^2)/(2*0.0102269096492807^2)) + 54941.8293572164 * exp((-(energy_eV-1.5321664735001)^2)/(2*0.01763494864617^2))"
謝謝你的幫助
非常感謝你,因爲我原來的問題是更復雜一點,雖然我不能用第二個提案。我會在完整問題(明天)進行更廣泛的測試後接受你的回答。再次感謝 ! –
我已經更新了代碼來計算'L'以顯示它如何從'nls'派生。 –
並進一步更新,以顯示如果二次方程表示爲字符串如何執行此操作。 –