【问题标题】:Why doesn't my function save my assignment?为什么我的函数没有保存我的作业?
【发布时间】:2013-03-07 11:54:53
【问题描述】:
f1 <- function(x) {
   zx1 <- sample(1:nrow(zone4[[x]]), nrow(zone4[[x]]), replace=F)
   zone4[[x]]$randnums <- zx1
}

f1(1)

## DOESN'T UPDATE zone4[[1]]

zx2 <- sample(1:nrow(zone4[[1]]), nrow(zone4[[1]]), replace=F)

zone4[[1]]$randnums <- zx2

## DOES UPDATE zone[[1]]

如果我创建一个如上所示的函数 f1(),则对象 'zone4[[x]]' 不会更新。但是,如果我运行与上面相同的命令但明确声明“x”,如下所示,则对象“zone4[[x]]”被更新。为什么会这样?我想知道,因为我想运行代码的迭代。如果在上面的函数 f1() 的定义中我写了“names(zone4[[x]])”,那么我得到的输出告诉我该函数做了它应该做的事情,但是当再次查询时,zone[[ x]] 似乎没有改变。谢谢您的帮助。这个想法是为给定年份和另一个变量区域的数据集的每个子集制作随机数。数据集原本是单个数据框,但是我使用split()函数将数据按照年份和区域分开,其中有4个。也许有更好的方法可以将随机数分配给特定的数据子集,而无需使用 split() 函数?

【问题讨论】:

  • 你忘记完成你的标题了吗?

标签: r function random subset assign


【解决方案1】:

R 函数通常没有副作用(即更改全局对象中的内容)

这是一件好事(大多数时候我们不希望出现意外后果)

惯用的做法是将结果赋给一个新的对象(可以同名覆盖原来的对象)

f1 <- function(x) {
  zx1 <- sample(1:nrow(zone4[[x]]), nrow(zone4[[x]]), replace=F)
  zone4[[x]]$randnums <- zx1
  # usually a good idea to return the complete object
  # especially when a replacement function (in your case `[[<-`)
  # is the last one called
  return(zone4)
}

zone4 <- f1(1)

另一种方法是使用data.table

library(data.table)
zone4 <- lapply(zone4, as.data.table)

f1 <- function(x) {
  zone4[[x]][,randnums := sample(.N)]
  invisible(NULL)
}

【讨论】:

  • zone4
  • @user2184368 -- 请举例说明zone4 的样子。你指的是哪个函数?
  • @mnel:如果它是更大数据结构的行/列/切片怎么办?
猜你喜欢
  • 1970-01-01
  • 2013-06-10
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多