我想讓以下代碼運行:
mu = 5
rnorm2 <- function(N) rnorm(N, mean = mu, sd = 1)
然后無論環境中是否存在 mu 變數,都可以使用 rnorm2 函式。換句話說,一勞永逸地將“mean”引數的值設定為“mu”值。
那可能嗎 ?
uj5u.com熱心網友回復:
您可以復制rnorm并設定函式默認值formals:
mu <- 5
rnorm2 <- rnorm
formals(rnorm2)$mean <- mu
輸出
> set.seed(1)
> rnorm2(5)
[1] 4.373546 5.183643 4.164371 6.595281 5.329508
> formals(rnorm2)
$n
$mean
[1] 5
$sd
[1] 1
uj5u.com熱心網友回復:
1) local with free variable我們可以local用來捕獲 的先驗值mu。
注意,所高速快取的值mu是mu_與被存盤在其中,所述環境rnorm3是定義在時相對于所述environmnent和一次被定義的時間rnorm3是第一次運行。
如果需要稍后設定它,那么我們可以使用environment(rnorm3)$mu_ <- 5,我們可以隨時使用environment(rnorm3)$mu_.
set.seed(123)
mu = 5
rnorm3 <- local({
if (exists("mu")) mu_ <- mu
function(N) rnorm(N, mean = mu_, sd = 1)
})
rnorm3(1)
## [1] 4.439524
rm(mu)
rnorm3(1)
## [1] 4.769823
2) 區域使用引數依賴自由變數,即mu在函式中使用但未定義的變數,可能不是最好的方法,因為它使除錯變得更加困難,而使用引數可能更可取。mu如果指定,則使用引數,如果未指定,則使用上次rnorm4呼叫時指定的值。
rnorm4 <- local({
mu_ <- NA
function(N, mu = mu_) {
mu_ <<- mu
rnorm(N, mu, 1)
}
})
set.seed(123)
rnorm4(1, 5)
## [1] 4.439524
rnorm4(1)
## [1] 4.769823
3) proto另一種方法是使用面向物件編程。proto 包使這變得特別容易,因為它可以定義物件而無需創建類來實體化它們。我們p用一個方法rnorm(rnorm在 stats中呼叫)和一個屬性創建一個物件mu。 p$rnorm將尋找p,mu以便我們可以洗掉mu外部p。請注意,該符號p$norm(1)表示將物件p作為第一個引數傳遞,將1 作為第二個引數傳遞。我們可以mu通過設定或查詢隨時重新定義或查詢p$mu。
library(proto)
p <- proto(rnorm = function(., N) stats::rnorm(N, mu, 1))
set.seed(123)
mu <- 5
p$mu <- mu
rm(mu)
p$rnorm(1)
## [1] 4.439524
4) options另一種可能性是存盤mu為 R 選項。
set.seed(123)
options(mu = 5)
rnorm5 <- function(N, mu = getOption("mu")) rnorm(N, mu, 1)
rnorm5(1)
## [1] 4.439524
uj5u.com熱心網友回復:
這會起作用嗎?
rnorm2 <- function(N, mu = 5, sd = 1) rnorm(N, mean = mu, sd = sd)
這只是將默認 mu 和 sd 分別設定為 5 和 1。
您可以使用rnorm2(N, 7, 2)(or rnorm2(N, mu = 7, sd = 2))偏離默認值,其平均值為 7,sd 為 2。
但如果你只是這樣做,rnorm2(N)它的平均值將為 5,sd 為 1。
(我也同意這里的其他答案,但我想知道您是否正在尋找一個更簡單的答案并且沒有提出正確的問題。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/342948.html
上一篇:在Javascript中創建一個名為zip()的函式
下一篇:C#多變數排行榜
