更改函数内的列表

时间:2016-06-20 16:38:10

标签: r list

我想对结构进行分析

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以使其正常工作?有可能吗?

2 个答案:

答案 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语言定义”手册以获取更多详细信息和示例。

(粗体是我的。)