【问题标题】:use values from different dataframes as input for nested function使用来自不同数据帧的值作为嵌套函数的输入
【发布时间】:2015-08-23 13:17:04
【问题描述】:

我如何运行以下代码,使用来自数据框I 的值的函数ftn4 的输出被newtonraphson 函数与来自数据框R0 的值结合使用。我想将输出存储在与I 和R0 具有相同维度(ncol = 5,nrow = 5)的新数据框(R)中。

我被卡住了,有什么想法吗?任何提示都非常感谢

c           = c(0.3)      
Ccf         = c(0.3)      
Acf         = c(3*10^-6)  
E           = c(0.00006) 
Ke          = c(1000)    

I           = as.data.frame(matrix(sample(seq(150,300,0.1),25), ncol = 5, nrow = 5))
R0          = as.data.frame(matrix(sample(seq(0.01,0.2,0.001),25), ncol = 5, nrow = 5))

library(spuRs) 

ftn4 <- function(x) {
  f = { x^2*exp(c*x)- (Ccf*Acf*E*(I/Ke+I))}
  f1 = { 2 * x * exp(c * x) + x^2 * (exp(c * x) * c)}
        return(c(f,f1))
}

R = as.data.frame(newtonraphson(ftn4, R0, tol = 1e-09 ,max.iter = 1000))

【问题讨论】:

  • 您的函数正在尝试通过使用数据帧 f 和值 f1 创建一个向量 c(f,f1)。尝试使用 ftn4(0.012) 之类的示例。看起来您必须更新您的函数,然后将其应用于 R0 的每一列。
  • @AntoniosK 问题在于newtonraphson 函数需要一个函数作为输入,该函数会产生像c(f,f1) 这样的向量,因为它使用迭代过程来收敛两个值

标签: r function wrapper


【解决方案1】:

按照 cmets 的规定,您应该将参数传递给函数 ftn4,该函数产生一个值。所以ftn4,应该改成:

ftn4 <- function(x,I) {
  f = { x^2*exp(c*x)- (Ccf*Acf*E*(I/Ke+I))}
  f1 = { 2 * x * exp(c * x) + x^2 * (exp(c * x) * c)}
  return(c(f,f1))
}

现在遍历您的矩阵 I 和 R0。

R <- data.frame(matrix(NA,nrow=nrow(I), ncol(I)))
for(i in 1:nrow(I)){
  for(j in 1:ncol(I)){
    R[i,j] <- newtonraphson(ftn  = function(x) ftn4(x, I[i,j]), 
                            x0  = R0[i,j], 
                            tol = 1e-09, 
                            max.iter = 1000)
  }
}

【讨论】:

  • @Vincent 如果我运行您的代码,我会收到以下错误消息:Error in newtonraphson(fx = function(x) ftn4(x, I[i, j]), x0 = R0[i, j], : unused argument (fx = function(x) ftn4(x, I[i, j]))
  • 是的,对不起,输入必须称为 ftn,而不是 fx!现在它对我有用,但我不知道这是否是您想要的结果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-26
  • 2011-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多