我想对结构进行分析
a <- list()
replicate_letter <- function(letter) {
return(data.frame(first_letter = rep(letter, 10),
second_letter = rep(letter, 10)))
}
get_letter <- function(letter) {
if (is.null(a[[letter]])) {
a[[letter]] <- replicate_letter(letter)
}
# Do further analysis, plotting,....
}
并经常致电get_letter
来执行。但是,这不起作用 - 函数运行,但a
不会改变。
我已经发现这是因为尝试更改函数内的列表
a <- list()
replicate_letter <- function(letter) {
return(data.frame(first_letter = rep(letter, 10),
second_letter = rep(letter, 10)))
}
for (letter in letters[1:3]) {
if (is.null(a[[letter]])) {
a[[letter]] <- replicate_letter(letter)
}
}
a
运行正常。如何更改函数get_letter
以使其正常工作?有可能吗?
答案 0 :(得分:3)
问题是在函数环境中修改了列表的副本,并在函数退出时销毁该副本。 R在这方面与许多其他语言不同,因为全局环境(默认情况下)不在函数内修改。
你应该让你的函数返回新列表:
get_letter <- function(a, letter) {
if (is.null(a[[letter]])) {
a[[letter]] <- replicate_letter(letter)
}
# Do further analysis, plotting,....
return(a)
}
通话:
a <- get_letter(a, 'c')
答案 1 :(得分:0)
我不太确定我是否了解你的情况,所以也许我可以用一点点盐。但请注意,您只在函数中分配a[[letter]] <- replicate_letter(letter)
的输出(之后会消失)。您可以尝试使用?<<-。考虑一下:
replicate_letter <- function(letter) {
return(data.frame(first_letter = rep(letter, 10),
second_letter = rep(letter, 10)))
}
get_letter <- function(letter) {
if (is.null(a[[letter]])) {
a[[letter]] <<- replicate_letter(letter)
}
# Do further analysis, plotting,....
}
get_letter("a")
a
# $a
# first_letter second_letter
# 1 a a
# 2 a a
# 3 a a
# 4 a a
# 5 a a
# 6 a a
# 7 a a
# 8 a a
# 9 a a
# 10 a a
<<-
的帮助读取(部分):
运算符&lt; - 和=分配到评估它们的环境中。运算符&lt; - 可以在任何地方使用,而operator =只允许在顶层使用(例如,在命令提示符下键入的完整表达式中)或作为支撑表达式列表中的子表达式之一。
运营商&lt;&lt; - 和 - &gt;&gt;通常只在函数中使用,并导致通过父环境进行搜索,以查找所分配变量的现有定义。如果找到这样的变量(并且其绑定未被锁定),则重新定义其值,否则在全局环境中进行赋值。请注意,它们的语义与S语言的语义不同,但与R的范围规则结合使用时,请参阅“R语言定义”手册以获取更多详细信息和示例。
(粗体是我的。)