【发布时间】:2021-11-04 18:25:46
【问题描述】:
嵌套 source()-ed 文件时,函数内的 R assign() 失败,但 assign() 可以自己工作。
我的小组有许多调用其他程序的 R 程序。我们创建了一个 getObjectFromCalledProgram() 函数来与 source(..., local = calledProgram
有人能解释一下为什么我们的 getObjectFromCalledProgram() 函数(它非常简单地使用了 assign() 函数)在一个 source()-ed 程序中失败,而直接使用的 assign 函数可以工作吗?
这是一个例子。看看exists("subSourceMeObject")在getObjectFromCalledProgram()函数后返回FALSE,而在assign()函数后返回TRUE:
## Program1 ##
getObjectFromCalledProgram <-function(objectName) assign(x=objectName, value=calledProgram[[objectName]], env = parent.frame())
# set up the program files to be source()-ed
Program3 <- tempfile() # this program will be called (source()-ed) within a source()-ed program.
writeLines(c(' ## Program3 ## ',' Program3Object <- "object3" '), con=Program3)
Program2 <- tempfile() # this will be the secondary program, called (source()-ed) by this main program.
writeLines(c(' ## Program2 ## '
, ' Program2Object <- "object2" '
, ' source(Program3, local=calledProgram <- new.env(), echo = T) '
, ' # Use getObjectFromCalledProgram() to put subSourceMeObject into Program2\'s environment.'
, ' (getObjectFromCalledProgram("Program3Object")) '
, ' # That DOES NOT WORK. It returns NULL. I.e., the assign() within getObjectFromCalledProgram() fails.'
, ' exists("Program3Object") # returns FALSE '
, ' # Use assign() directly rather than within the Program3Object function. WORKS.'
, ' (assign("Program3Object", calledProgram[["Program3Object"]])) '
, ' exists("Program3Object") # returns TRUE '
, ' # That WORKS. It returns "object2". I.e., the assigs() function did pull Program3Object into Program2\'s environment. '
)
, con=Program2
)
# source() those program files.
source(Program2, local=calledProgram <- new.env(), echo = T)
# Pull the created Program2Object and Program3Object into Program1's unlist(lapply(c("Program2Object", "Program3Object"), exists)) # the objects don't exist in Program1's environment.
environment, to show that getObjectFromCalledProgram() works.
(getObjectFromCalledProgram("Program2Object")) # put Program2Object into Program1's environment.
(getObjectFromCalledProgram("Program3Object")) # put Program3Object into Program1's environment.
unlist(lapply(c("Program2Object", "Program3Object"), exists)) # the objects now exist in Program1's environment.
rm(getObjectFromCalledProgram, Program2, Program3, Program2Object, Program3Object) # Clean up.
【问题讨论】:
-
写一个包