为了账号安全,请及时绑定邮箱和手机立即绑定

分配有:=FROM函数的data.table对象未打印

分配有:=FROM函数的data.table对象未打印

犯罪嫌疑人X 2019-07-13 15:39:08
我想修改data.table在一个功能范围内。如果我使用:=函数中的特性,结果仅用于第二次调用。请看下面的插图:library(data.table)mydt <- data.table(x = 1:3, y = 5:7)myfunction <- function(dt) {    dt[, z := y - x]    dt}当我只调用函数时,表就不会打印(这是标准行为)。但是,如果我保存返回的data.table在一个新的对象中,它不是在第一个调用时打印出来的,而是为第二个调用而打印的。myfunction(mydt)  # nothing is printed   result <- myfunction(mydt) result  # nothing is printedresult  # for the second time, the result is printedmydt                                                                     #    x y z# 1: 1 5 4# 2: 2 6 4# 3: 3 7 4 你能解释一下为什么会发生这种情况吗?如何防止?
查看完整描述

2 回答

?
Helenr

TA贡献1780条经验 获得超3个赞

我很抱歉,如果我不应该在这里发布一些东西,这不是一个答复,但我的帖子太长,不能发表评论。

我想指出的是,Janosdivenyi的解决方案是添加一个尾随[]dt并不总是像下面这样给出预期的结果(即使使用data.table 1.9.6或1.10.4)。

下面的例子表明,如果dt是函数中的最后一行,可以在没有尾随的情况下获得所需的行为。[],但是如果dt不位于函数的最后一行,则为拖尾。[]才能得到想要的行为。

第一个例子显示,没有尾随[]在……上面dt我们得到了预期的行为dt在函数的最后一行

mydt <- data.table(x = 1:3, y = 5:7)myfunction <- function(dt) {
  df <- 1
  dt[, z := y - x]}myfunction(mydt)  # Nothing printed as expectedmydt  # Content printed as desired##    
  x y z## 1: 1 5 4## 2: 2 6 4## 3: 3 7 4

添加拖尾[]在……上面dt出其不意

mydt <- data.table(x = 1:3, y = 5:7)myfunction <- function(dt) {
  df <- 1
  dt[, z := y - x][]}myfunction(mydt)  # Content printed unexpectedly##    x y z## 1: 1 5 4## 2: 2 6 4## 3: 
  3 7 4mydt  # Content printed as desired##    x y z## 1: 1 5 4## 2: 2 6 4## 3: 3 7 4

移动df <- 1在DT之后没有尾随[]出其不意

mydt <- data.table(x = 1:3, y = 5:7)myfunction <- function(dt) {
  dt[, z := y - x]
  df <- 1}myfunction(mydt)  # Nothing printed as expectedmydt  # Nothing printed unexpectedly

移动df <- 1在DT后面有一个尾随[]给出预期的行为

mydt <- data.table(x = 1:3, y = 5:7)myfunction <- function(dt) {
  dt[, z := y - x][]
  df <- 1}myfunction(mydt)  # Nothing printed as expectedmydt  # Content printed as desired##    
  x y z## 1: 1 5 4## 2: 2 6 4## 3: 3 7 4


查看完整回答
反对 回复 2019-07-13
  • 2 回答
  • 0 关注
  • 386 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信