2015-03-11 3 views
0

так у меня есть ошибка ...Plotting постоянную функцию в R с кривой()

f <- function(x){return(1)} 
curve(f(x),0,100,xname="x") 

Error in curve(f(x), 0, 100, xname = "x") : 
'expr' did not evaluate to an object of length 'n' 

Что странно, учитывая, что

F <- function(x){return(0*x+1)} 
curve(F(x),0,100,xname="x") 

прекрасно работает ... Об этом проинформировал меня подумайте о том, как R обрабатывает data.frame() s.

a <- data.frame(1,2,3) 
f(a) 
# [1] 1 
F(a) 
# X1 X2 X3 
# 1 1 1 1 

Это означает, что функция Vectorize() исправит мою проблему. Безрезультатно это острый пример неявных решений, которые делает R, что приводит к непоследовательному поведению.

+0

Из 'curve':' Expr Имя функции, или вызов или выражение записывается в виде функции от х, которые будут оценивать на объект такой же длины, как x.' В вашей первой функции вы не используете/не оцениваете 'x'. Если вы хотите, чтобы константа возвращалась, она работает: 'f <- function (x) {x-x + 1}'. –

+0

Итак, это трение, без сильных ошибок при вводе текста, когда вы их не ожидаете. К счастью, F <- Vectorize (function (x) {return (1)}) явно задает поведение, требуемое для Curve(). [typing] (http://en.wikipedia.org/wiki/Strong_and_weak_typing) – kpie

ответ

1

Проблема заключается в том, что функция должна возвращать вектор той же длины, что и параметр. В вашем случае вместо n функция всегда возвращает вектор только одного. Решением может быть

f <- function(x){return(rep(1,length(x)))} 
+0

Я почти уверен, что кривая передает заданную функцию в кадр данных. Зная это, странность почти имеет смысл. – kpie