2017-04-10 24 views
0

當我嘗試爲元素列表或數據框的一部分運行我的函數時,我收到警告消息和錯誤答案。它完美地運行一個單一的數字。爲用戶定義的函數運行一組元素?

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 測試< - C(0.031,0.45,0.65) getybezier(測試,bezier_points) [1] 0.03205104 警告消息: 在bezpointsdf [1]> X: 較長物體長度不短對象長度

的倍數有沒有一種方法,通過該我可以消除此警告消息?它給了我錯誤的答案。我知道它這樣做的原因。但是,我不知道如何解決這個問題。有人可以幫忙嗎?

回答

0

它返回一個錯誤的原因是函數不知道如何處理一個長於1的對象,對於你定義的函數中的x參數,這對性能來說是最好的。通過使用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 
+0

非常感謝!完美地工作 –