2013-10-19 34 views
0

我写了一个函数来计算BMI并使代码创建相应的图形输出。我的目标是将图形输出包含到函数中,以便通过使用该函数来获得图形。如何将图形输出包含到函数中

我当前的代码:

BMI <- function(meter, kg){ 
    BMI <- kg/(meter^2) 
    return(BMI) 
} 
BMI(1.8,70) 

x <- seq(1.5, 1.9, by = 0.001) 
y <- seq(30, 200, by = 0.5) 
z <- outer(x, y, FUN = function(x, y) {BMI(x, y)}) 
contour(x, y, z, nlevels = 10, method = "edge", main = "BMI") 
abline(h = 70, v=1.8, col="darkgrey") 
points(1.8,70, col="red", cex=2, pch=16, bg="red") 

仅通过修改仪表&公斤,我想获得一个图用正确的线和点定位功能。我从下面的代码开始 - 但它不起作用。

graphicalBMI <- function(meter, kg){ 
    BMI <- kg/(meter^2) 
    x <- seq(1.5, 1.9, by = 0.001) 
    y <- seq(30, 200, by = 0.5) 
    z <- outer(x, y, FUN = function(x, y) {graphicalBMI(x, y)}) 
    contour(x, y, z, nlevels = 10, method = "edge", main = "BMI") 
    abline(h = kg, v= meter, col="darkgrey") 
    points(meter, kg, col="red", cex=2, pch=16, bg="red") 
    return(graphicalBMI) 
} 

回答

1

你的第二个函数的问题是它产生了无限递归。
如果你改变它这样你会得到你想要的东西:

graphicalBMI <- function(meter, kg, showPlot=TRUE){ 

    BMI <- kg/(meter^2) 

    if(showPlot){ 
    x <- seq(1.5, 1.9, by = 0.001) 
    y <- seq(30, 200, by = 0.5) 

    # here we call graphicalBMI by setting showPlot=F to avoid infinite recursion 
    z <- outer(x, y, FUN = function(x, y) {graphicalBMI(x, y, FALSE)}) 
    contour(x, y, z, nlevels = 10, method = "edge", main = "BMI") 
    abline(h = kg, v= meter, col="darkgrey") 
    points(meter, kg, col="red", cex=2, pch=16, bg="red") 
    } 
    return(BMI) 
} 


# usage example: 
graphicalBMI(1.8,70) # plot produced 

graphicalBMI(1.8,70,FALSE) # no plot produced 
+0

编辑:简化功能删除内部函数。 – digEmAll

相关问题