为一组元素运行用户定义的函数?

时间:2017-04-10 11:45:43

标签: r

当我尝试运行我的函数以获取元素列表或数据框的一部分时,我收到了警告消息和错误的答案。它完全适合单个数字。

library(bezier)
t <- seq(0, 1, length=100)
p <- matrix(c(0.03,0.03,0, 0.335,0.6,0, 0.667,0.9,0, 1,1,0), nrow=4, ncol=3, byrow=TRUE)
bezier_points <- bezier(t=t, p=p[, 1:2])


getybezier <- function(x, bezpointsdf) 
{
  ind <- min(which(bezpointsdf[,1] > x))
  return(bezier_points[ind,2])
}

getybezier(0.45, bezier_points)
test <- c(0.031, 0.45, 0.65)
getybezier(test, bezier_points)
  

getybezier(0.45,bezier_points)   [1] 0.6358359   测试&lt; - c(0.031,0.45,0.65)   getybezier(test,bezier_points)   [1] 0.03205104   警告信息:   在bezpointsdf [,1]&gt; X :     较长的物体长度不是较短物体长度的倍数

有没有办法可以删除此警告消息?它给了我错误的答案。我知道它之所以这样做的原因。但是,我不知道如何纠正这个问题。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

它返回错误的原因是该函数不知道如何为您定义的函数中的x参数处理长于1的对象,这在性能方面是最佳的。您可以使用apply系列函数完成在多个测试值上运行此函数。

如果您希望输出位于列表中,可以使用lapply()

lapply(test, getybezier, bezpointsdf = bezier_points)

给你:

> lapply(test, getybezier, bezpointsdf = bezier_points)
[[1]]
[1] 0.04719015

[[2]]
[1] 0.6361454

[[3]]
[1] 0.8233659

或者,如果您想在矢量中输出,可以使用sapply()

sapply(test, getybezier, bezpointsdf = bezier_points)

给你:

> sapply(test, getybezier, bezpointsdf = bezier_points)
[1] 0.04719015 0.63614540 0.82336591