R:有些东西是通过ref复制而不是按值复制

时间:2015-04-10 14:39:35

标签: r data.table

我有一个非常大的数据帧df。 在某些时候,我想使用sqlSave()将其保存到数据库中。由于数据库表的结构大致相似但列名不完全相同,我首先要进行一些按摩。因此,我做了以下几点:

# I believe i'm copying by val
mycopy <- df

# but i also know setnames uses references... so is this the culprit?
setnames(mycopy, names(mycopy)[1], "NewColumnName")

由于我的应用程序的其他部分发出警告,我发现原来的'df'数据框在我的全局环境窗口中的RStudio中已经重命名了列名等,这让我很震惊!我如何阻止这种情况发生?为什么setnames()没有指向'mycopy'而不是原来的'df'?

更新可重现的示例

library(data.table) # for setnames
df <- data.frame(foo=c(1,2,3), bar=c(4,5,6))
mycopy <- df
setnames(mycopy, names(mycopy)[1], "NewColumnName")
str(df)

得出这个:

> str(df)
'data.frame':   3 obs. of  2 variables:
 $ NewColumnName: num  1 2 3
 $ bar          : num  4 5 6

这不应该发生?

1 个答案:

答案 0 :(得分:0)

实际上,这个非R问题: How to clone or copy a list?给了我一些如何强制按值复制的提示。

所以最后我做了:

mycopy <- data.frame(df)

它似乎有效。我不知道我之前从未注意到R正在通过ref进行复制......