兩個變量,x
和y
,其中x
被包含在環境1 和y
的表達式被包含在第二環境中存在的對象評價的表達式。程序員如何評估 表達式?
詳細版本
我有一個函數,它接受一個formula
和data.frame作爲參數。在 formula
的右側是函數splines::bs
到 的調用生成一個B樣條的基礎。主力功能會執行一些操作,其中一項是 ,它需要從公式中提取bs
呼叫並對其進行評估。我試圖解決的 問題涉及在參數 值包含在不同環境中時評估bs
調用。
下面是重現我的工作問題所需的功能上
library(splines)
extract_bmat <- function(form) {
B <- NULL
rr <- function(x) {
if (is.call(x) && grepl("bs", deparse(x[[1]]))) {
B <<- x
} else if (is.recursive(x)) {
as.call(lapply(as.list(x), rr))
} else {
x
}
}
z <- lapply(as.list(form), rr)
B
}
some_workhorse <- function(formula, data) {
# ... lots of cool stuff ...
# fit <- lm(formula, data)
bmat <- eval(extract_bmat(formula), data)
bmat
}
# The following works when evaluated in the .GlobalEnv
# The eval(extract_bmat(formula), data) call within the some_workhorse
# function works without errors
xi <- c(3, 4.5)
eg_data <- data.frame(x = 1:10, y = sin(1:10))
some_workhorse(y ~ bs(x, knots = xi), data = eg_data)
現在,如果函數some_workhorse
和xi
載體和eg_data
data.frame
是一個功能環境內產生導致錯誤。
foo <- function() {
xi_in_foo <- c(2, 3)
eg_data_in_foo <- data.frame(x = 1:10, y = sin(1:10))
some_workhorse(y ~ bs(x, knots = xi_in_foo), data = eg_data_in_foo)
}
foo()
# Error in sort(c(rep(Boundary.knots, ord), knots)) :
# object 'xi_in_foo' not found
錯誤的位置是splines::bs
調用中,但事實並非 重要組成部分;找不到xi_in_foo
是要解決的重要問題。
我知道這個問題與我在我的河原 問題處理不當的環境是
- 應如何
some_workhorse
函數中調用eval(extract_bmat(formula), data)
寫成這樣在調用時它正常工作 或.GlobalEnv
或在函數環境中調用?
次要問題:
- 內
extract_bmat
功能,我寧願定義環境 爲B
和使用assign
,而不是<<-
。我懷疑<<-
是最好的 選項,因爲發生遞歸水平的不確定性。這就是說,我想看看其他解決方案。
感謝您的幫助。
謝謝你的幫助和解釋。我曾嘗試使用parent.frame()作爲沒有成功的機箱。我很欣賞你回答這個問題和其他問題的時間。 – Peter