2009-09-30 3 views
1

J'ai une fonction pour calculer l'inverse d'une équation quadratique. Par défaut, il donne les deux solutions possibles:Comment appliquer Min ou Max à chaque résultat d'une fonction séparément?

invquad<-function(a,b,c,y,roots="both") 
{ 
    #Calculate the inverse of a quadratic function y=ax^2+bx+c (i.e. find x when given y.) 
    #Gives NaN with non real solutions. 
    root1<-sqrt((y-(c-b^2/(4*a)))/a)-(b/(2*a)) 
    root2<--sqrt((y-(c-b^2/(4*a)))/a)-(b/(2*a)) 
    if (roots=="both") 
     result<-c(root1,root2) 
    if (roots=="min") 
     result<-min(root1,root2) 
    if (roots=="max") 
     result<-max(root1,root2) 
    result 
} 

Cela fonctionne bien si on leur donne une seule valeur de y, mais si je donne une liste ou une colonne d'une trame de données, puis les éléments min et max me donnent la valeur minimale de la liste entière. Je veux qu'il retourne juste le résultat minimum pour cet élément. Je suppose que l'itération sur la liste est possible, mais ce n'est pas très efficace.

Des idées?

Répondre

7

Remplacer la fonction min (max) par pmin (pmax):

> invquad(1,2,3,3,"min") 
[1] -2 
> invquad(1,2,3,4,"min") 
[1] -2.414214 
> invquad(1,2,3,c(3,4),"min") 
[1] -2.000000 -2.414214 
+0

Parfait! Exactement ce que je cherchais.... – PaulHurleyuk

1

Jetez un oeil à plyr-package - il permet de diviser une liste/trame de données en plus petits morceaux, puis d'appliquer votre fonction à ce sous-ensemble.

Questions connexes