Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2015
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.61 KB | None | 0 0
  1. # surf.R
  2.  
  3. # 名前の検索
  4. findConventionalNames <- function(mod) {
  5. # モジュールに属するオブジェクト名、モジュール名が接頭辞に付く
  6. modulePattern <- paste("^", mod, "\\.*", sep = "")
  7. # モジュールに属するがプライベート扱いのオブジェクト名、先頭がドット
  8. modulePrivatePattern <- paste("^\\.", mod, "\\.*", sep="")
  9. # クラスに属するメソッド名
  10. classPattern <- paste("^.+\\.", mod, "$", sep="")
  11. # クラスに属するライベートメソッド名
  12. classPrivatePattern <- paste("^\\..+\\.", mod, "$", sep="")
  13.  
  14. list(
  15. module = ls(envir = .GlobalEnv, pattern=modulePattern),
  16. modulePrivate = ls(envir = .GlobalEnv, pattern=modulePrivatePattern, all=TRUE),
  17. class = ls(envir = .GlobalEnv, pattern=classPattern),
  18. classPrivate = ls(envir = .GlobalEnv, pattern=classPrivatePattern, all=TRUE)
  19. )
  20. }
  21.  
  22. # この“モジュール”で使用されている名前を列挙する
  23. surf.names <- function() {
  24. # モジュール名
  25. mod <- "surf"
  26. # このモジュールで定義した大域名
  27. global <- c("findConventionalNames", "makeZMatrix")
  28.  
  29. names <- findConventionalNames(mod)
  30. names[["global"]] <- global
  31. names
  32. }
  33.  
  34. # 2変数関数の値(zの値)を成分とする行列を作成する
  35. makeZMatrix <-
  36. function (
  37. # 2変数関数の式、コールオブジェクトを渡す
  38. expr,
  39. # 2変数関数の第1変数、第2変数の名前、文字列で指定する
  40. xname = "x", yname = "y",
  41. # 2変数関数の第1変数、第2変数の描画域
  42. xlim = c(-1, 1), ylim = c(-1, 1),
  43. # 描画域を幾つの少区間に分割するか(分割数)
  44. xdiv = 20, ydiv = 20,
  45. # 2変数関数の式が評価される環境、リストか環境オブジェクト
  46. bind = list(),
  47. # 関数値マトリックス作成時にouterを用いるかどうか
  48. use.outer = FALSE)
  49. {
  50. x0 <- xlim[1]
  51. x1 <- xlim[2]
  52. y0 <- ylim[1]
  53. y1 <- ylim[2]
  54. xStep <- (x1 - x0)/xdiv
  55. yStep <- (y1 - y0)/ydiv
  56.  
  57. xBreaks <- seq(from = x0, to = x1, by = xStep)
  58. yBreaks <- seq(from = y0, to = y1, by = yStep)
  59.  
  60. # 関数の仮引数リストの作成
  61. fplist <- list(noDefault(), noDefault()) # デフォルト値なし2変数
  62. names(fplist) <- c(xname, yname) # 引数名を指定
  63. # 関数の作成
  64. envir <- new.env(parent = .GlobalEnv)
  65. for (nm in names(bind)) {
  66. envir[[nm]] <- bind[[nm]]
  67. }
  68. fun <- makeFunction(fplist, expr, envir)
  69.  
  70. if (use.outer) {
  71. zMatrix <- outer(xBreaks, yBreaks, fun)
  72. } else {
  73. zMatrix <- matrix(NA, xdiv + 1, ydiv + 1)
  74. for (i in 1:(xdiv + 1)) {
  75. for (j in 1:(ydiv + 1)) {
  76. zMatrix[i, j] <- fun(xBreaks[i], yBreaks[j])
  77. }
  78. }
  79.  
  80. }
  81. list(
  82. x = xBreaks,
  83. y = yBreaks,
  84. z = zMatrix
  85. )
  86. }
  87.  
  88. # 2変数関数の曲面(3Dグラフ)を描く
  89. # 非標準評価方式
  90. surf <-
  91. function (
  92. # 2変数関数の式、引数として式を書く
  93. z,
  94. # 2変数関数の第1変数、第2変数の名前、文字列でもシンボルでもどっちでもよい
  95. xname = "x", yname = "y",
  96. # 2変数関数の第1変数、第2変数の描画域、原点中心正方形の辺長の半分
  97. half = 1,
  98. # 2変数関数の第1変数、第2変数の描画域、共通
  99. lim = c(-1*half, half),
  100. # 2変数関数の第1変数、第2変数の描画域、個別
  101. xlim = lim, ylim = lim,
  102. # 描画域を幾つの少区間に分割するか(分割数)、共通
  103. div = 20,
  104. # 描画域を幾つの少区間に分割するか(分割数)、個別
  105. xdiv = div, ydiv = div,
  106. # 2変数関数の式が評価される環境、リストで指定
  107. bind = list(),
  108. # 関数値マトリックス作成時にouterを用いるかどうか
  109. use.outer = FALSE,
  110. # ラベル文字列
  111. xlab = NULL, ylab = NULL, zlab = NULL,
  112. # 関数値の描画域
  113. zlim = NULL,
  114. # perspのオプション
  115. theta = 30, phi = 30, expand = 0.5, col = "skyblue",
  116. # perspへの引数リストを戻り値として出力するか
  117. output.args = FALSE
  118. )
  119. {
  120. z <- substitute(z) # 式を評価せずに取り出す
  121. xname <- substitute(xname) # 文字列、または評価しない名前を取り出す
  122. yname <- substitute(yname) # 文字列、または評価しない名前を取り出す
  123. # 名前を文字列にする
  124. xname <- as.character(xname)
  125. yname <- as.character(yname)
  126.  
  127. surf_(z, xname, yname, half, lim, xlim, ylim, div, xdiv, ydiv,
  128. bind,
  129. use.outer, xlab, ylab, zlab, zlim, theta, phi, expand, col, output.args)
  130. }
  131.  
  132. # 2変数関数の曲面(3Dグラフ)を描く
  133. # 標準評価方式
  134. surf_ <-
  135. function (
  136. # 2変数関数の式、callオブジェクトを渡す
  137. z,
  138. # 2変数関数の第1変数、第2変数の名前、文字列で渡す
  139. xname = "x", yname = "y",
  140. # 2変数関数の第1変数、第2変数の描画域、原点中心正方形の辺長の半分
  141. half = 1,
  142. # 2変数関数の第1変数、第2変数の描画域、共通
  143. lim = c(-1*half, half),
  144. # 2変数関数の第1変数、第2変数の描画域、個別
  145. xlim = lim, ylim = lim,
  146. # 描画域を幾つの少区間に分割するか(分割数)、共通
  147. div = 20,
  148. # 描画域を幾つの少区間に分割するか(分割数)、個別
  149. xdiv = div, ydiv = div,
  150. # 2変数関数の式が評価される環境、リストで指定
  151. bind = list(),
  152. # 関数値マトリックス作成時にouterを用いるかどうか
  153. use.outer = FALSE,
  154. # ラベル文字列
  155. xlab = NULL, ylab = NULL, zlab = NULL,
  156. # 関数値の描画域
  157. zlim = NULL,
  158. # perspのオプション
  159. theta = 30, phi = 30, expand = 0.5, col = "skyblue",
  160. # perspへの引数リストを戻り値として出力するか
  161. output.args = FALSE
  162. )
  163. {
  164.  
  165. # 関数値のマトリックスを作成する
  166. xyz <- makeZMatrix(z,
  167. xname = xname, yname = yname,
  168. xlim = xlim, ylim = ylim,
  169. xdiv = xdiv, ydiv = ydiv,
  170. bind = bind,
  171. use.outer = use.outer)
  172.  
  173. # perspの引数リストを作成する
  174. args <- list(
  175. x = xyz$x,
  176. y = xyz$y,
  177. z = xyz$z,
  178. xlab = if (is.null(xlab)) xname else xlab,
  179. ylab = if (is.null(ylab)) yname else ylab,
  180. zlab = if (is.null(zlab)) deparse(z) else zlab,
  181. xlim = xlim,
  182. ylim = ylim,
  183. theta = theta,
  184. phi = phi,
  185. expand = expand,
  186. col = col
  187. )
  188. if (!is.null(zlim)) {
  189. args[["zlim"]] <- zlim
  190. }
  191.  
  192. # 描画関数の呼び出し
  193. do.call("persp", args)
  194. # output.argsがTRUEなら引数リストを返す
  195. if (output.args) args
  196. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement