计算r中的截断多项式



我正试着根据这个公式写一个函数。

(x − x0)^ r+ = { (x-x0)^r   if x>x0
0       otherwise

我从上面理解的是;

y= (x-x0)^r除非x<= x0

所以对于的每个元素,如果大于,则返回等于公式的y。

tp <- function(x,x0,r) {
y<-list()
if (x[i] >x0) {
for (i in seq_along(x)) {
y<- append((x[i]-x0)^r)
} else {
y <- append(0)
}

}
return(y)
}

我试过这样做,但我不能使它工作。谁能告诉我,如果我理解的公式是正确的,如果是,什么是正确的方法来混合它。

if else语句的另一种选择是使用布尔逻辑,这是我喜欢的。但两者都可以。

tp <- function(x, x0, r) {
#  ifelse(x > x0, (x - x0)^r, 0)
(x > x0)*(x - x0)^r
}
x0 <- 2
tp(-2:5, x0, r = 2)
#> [1] 0 0 0 0 0 1 4 9

使用ifelse

tp <- function(x, x0, r) {
ifelse(x > x0, (x - x0)^r, 0)
}
x0 <- 2
tp(-2:5, x0, r = 2)
#> [1] 0 0 0 0 0 1 4 9

创建于2022-12-01使用reprex v2.0.2

功能问题:

  • append需要添加值的列表或向量,因此您需要执行y <- append(y, ...);
  • 您的for表达式应该是(外部)第一个(x[i] > x0)条件之前;和
  • 可能是主观的,但我建议y <- numeric(0)对我来说比list更有意义。当然,有时候列个清单是有意义的,但这不是其中之一(在我看来)。同样,没有错,但稍后的处理可能会更有效的作为一个矢量。

可能是这样的:

tp <- function(x,x0,r) {
y <- numeric(0)
for (i in seq_along(x)) {
if (x[i] > x0) {
y <- append(y, (x[i]-x0)^r)
} else {
y <- append(y, 0)
}
}
return(y)
}

在R中,几乎总是倾向于使用向量化操作而不是for循环。在这种情况下,我认为您可以很容易地使用RuiBarradas提供的矢量化函数(这是编写这类函数的首选方法)。

最新更新