R Don';I don’传递给函数时,不希望修改原始data.table

R Don';I don’传递给函数时,不希望修改原始data.table,r,ggplot2,data.table,R,Ggplot2,Data.table,我是data.table的粉丝,我喜欢编写可重用函数来满足当前和未来的需求 在解决这个问题时,我遇到了一个挑战: 我们将data.table传递给函数进行绘图,然后修改原始data.table,尽管我们制作了它的副本以防止这种情况发生 下面是一个简单的代码来说明: plotYofX <- function(.dt,x,y) { dt <- .dt dt[, (c(x,y)) := lapply(.SD, function(x) {as.numeric(x)}), .SDcol

我是
data.table
的粉丝,我喜欢编写可重用函数来满足当前和未来的需求

在解决这个问题时,我遇到了一个挑战:

我们将data.table传递给函数进行绘图,然后修改原始data.table,尽管我们制作了它的副本以防止这种情况发生

下面是一个简单的代码来说明:

plotYofX <- function(.dt,x,y) {
  dt <- .dt
  dt[, (c(x,y)) := lapply(.SD, function(x) {as.numeric(x)}), .SDcols = c(x,y)]
  ggplot(dt) + geom_step(aes(x=get(names(dt)[x]), y=get(names(dt)[y]))) + labs(x=names(dt)[x], y=names(dt)[y])
}


> dtDiamonds <- data.table(ggplot2::diamonds[2:5,1:3]); 
> dtDiamonds
   carat     cut color
   <num>   <ord> <ord>
1:  0.21 Premium     E
2:  0.23    Good     E
3:  0.29 Premium     I
4:  0.31    Good     J

> plotYofX(dtDiamonds,1,2); 
> dtDiamonds
    carat   cut color
    <num> <num> <ord>
1:  0.21     4     E
2:  0.23     2     E
3:  0.29     4     I
4:  0.31     2     J
plotYofX plotYofX(dtDiamonds,1,2);
>DTD钻石
克拉切色
1:0.214东
2:0.232E
3:0.294 I
4:0.312J
我在函数中看到了许多关于使用
:=
的各种问题的帖子,但找不到任何帮助我解决这个看似非常简单的问题的帖子。(当然,我不知道如何将其转换回
data.frame
以实现所需的结果)

尝试:

dt <- copy(.dt)

dt忽略:=函数似乎成功了。当然,我将ggplot值包装在
print(.)
中,这是在函数内部工作并需要输出时的标准做法:

plotYofX <- function(.dt,x,y) {
  dt <- .dt
  dt[,  lapply(.SD, function(x) {as.numeric(x)}), .SDcols = c(x,y)]
  print( ggplot(dt) + geom_step(aes(x=get(names(dt)[x]), y=get(names(dt)[y]))) + labs(x=names(dt)[x], y=names(dt)[y]) )
}

> png(); plotYofX(dtDiamonds,1,2); dev.off()
quartz 
     2 
>  dtDiamonds
   carat     cut color
1:  0.21 Premium     E
2:  0.23    Good     E
3:  0.29 Premium     I
4:  0.31    Good     J
plotYofX dtDiamonds
克拉切色
1:0.21 E
2:0.23好E
3:0.29高级一级
4:0.31好J

感谢上面的评论/回答:这将是该特定函数的最简单解决方案(即根本不需要引入任何额外的
.dt
变量)


plotYofX由于
:=
通过引用指定值,因此需要进行显式复制。所以
dt看起来很简单。不要使用
:=
,但可能我遗漏了什么。太好了!事实上,甚至不需要做dt
plotYofX <- function(dt,x,y) {
  dt[,  lapply(.SD, function(x) {as.numeric(x)}), .SDcols = c(x,y)]
  ggplot(dt) + geom_step(aes(x=get(names(dt)[x]), y=get(names(dt)[y]))) + labs(x=names(dt)[x], y=names(dt)[y])