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")

関数でメートルとkgを変更するだけで、正しい線と点の配置で図を取得したいと思います。以下のコードから始めましたが、まだ機能しません。

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)
}
4

1 に答える 1

1

2 番目の関数の問題は、無限再帰が生成されることです。
このように変更すると、必要なものが得られます。

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
于 2013-10-19T10:32:42.953 に答える