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])