如何在R中定义整数参数? (缺少参数“ a”,没有默认值)

时间:2019-06-01 18:25:34

标签: python r

我正在尝试在R中重新创建python代码,但是无论如何我都会收到错误消息。

这是我的python代码,有效

def Cp(T,a,b,c):
    return a+b*T+c*(T**2)
a = np.array([26.63, 20.04, 13.39])
b = np.array([0.183, 0.0945, 0.077])
c = -np.array([45.86, 30.95, 18.71])*(10**(-6))
Tp = 298
Tk = 1035
RE = np.array([0, 1, 2])
Cps1 = [(1/(Tk-Tp))*si.romberg(Cp, Tp, Tk, args=(a[i], b[i], c[i])) for  i in RE]
Cps1

这就是我在R中尝试执行此操作的方式

Cp <- function(Te,a,b,c) a+b*Te+c*(Te**2)
a1 <- c(26.63, 20.04, 13.39)
b1 <- c(0.183, 0.0945, 0.077)
c1 <- -c(45.86, 30.95, 18.71)*(10**(-6))
Tp <- 298
Tk <- 1035
require(pracma)
for(i in seq(1,3,1)){
  Cps1[i] <- (1/(Tk-Tp))*integral(Cp, Tp, Tk, a=a1[i], b=b1[i], c=c1[i])
}
Cps1

在python中,我得到了

[126.15165675333331, 67.87464798333333, 55.55221070333332]

但是在R中,我得到一个错误:

  

缺少参数“ a”,没有默认值

3 个答案:

答案 0 :(得分:2)

我认为这是因为a = a1[i]integral开头的a的参数abstol相匹配。

因此,一种解决方案是指定abstol

integral(Cp, Tp, Tk, abstol=0, a=a1[1], b=b1[1], c=c1[1])
# 92973.77

这与Python结果相符:

> 92973.77/(Tk-Tp)
[1] 126.1517

说明

pracma::integral函数中存在编码错误。此函数使用match.fun的方式类似于下面的函数I1

I1 <- function(f, abstol=0, ...){
  f <- match.fun(f)
  ff <- function(x) f(x, ...)
  ff(1)
}

f <- function(x, a) x + a

I1(f, a = 2)
# Error in f(x, ...) : argument "a" is missing, with no default

编码这种情况的正确方法是将参数...放在其他参数之前:

I2 <- function(f, ..., abstol=0){
  f <- match.fun(f)
  ff <- function(x) f(x, ...)
  ff(1)
}

f <- function(x, a) x + a

I2(f, a = 2)
# 3

答案 1 :(得分:0)

您可以在循环中显式更改额外的参数输入,并更改原始功能

require(pracma)

Cp <- function(Te) {
  a + b * Te + c * (Te**2)
}

a1 <- c(26.63, 20.04, 13.39)
b1 <- c(0.183, 0.0945, 0.077)
c1 <- -c(45.86, 30.95, 18.71) * (10**(-6))
Tp <- 298
Tk <- 1035
Cps1 = NA

for(i in 1:3){
  a = a1[i]
  b = b1[i]
  c = c1[i]
  Cps1[i] = (1 / (Tk - Tp)) * integral(Cp, Tp, Tk)
t}

Cps1 

[1] 126.15166  67.87465  55.55221

答案 2 :(得分:0)

就像用户@StéphaneLaurent在他的answer中说的那样,我还认为这是因为参数aabstol匹配。
解决此问题的另一种方法是将Cp函数参数名称更改为A

Cp <- function(x, A, b, c) A + b*x + c*(x**2)

Cps1 <- numeric(3)
for(i in seq(1, 3, 1)){
  res <- integral(Cp, xmin = Tp, xmax = Tk, method = "Kronrod",
                  A = a1[i], b = b1[i], c = c1[i])
  Cps1[i] <- (1/(Tk-Tp))*res
}

Cps1
#[1] 126.15166  67.87465  55.55221