r - data.table के साथ असाइन किए गए ऑब्जेक्ट:=से फ़ंक्शन के भीतर मुद्रित नहीं




function assignment-operator (2)

जैसा कि डेविड अर्नबर्ग ने एक comment में उल्लेख किया है, इसका उत्तर github.com/Rdatatable/data.table/blob/master/… पाया जा सकता github.com/Rdatatable/data.table/blob/master/… । संस्करण ६.१.६ में एक बग तय किया गया था लेकिन फिक्स ने इसे नकारात्मक रूप से पेश किया।

इस व्यवहार को रोकने के लिए फ़ंक्शन के अंत में DT[] को कॉल करना चाहिए।

myfunction <- function(dt) {
    dt[, z := y - x][]
}
myfunction(mydt)  # prints immediately
#    x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4 

मैं एक फ़ंक्शन के भीतर एक data.table को संशोधित करना चाहूंगा। यदि मैं फ़ंक्शन के भीतर := सुविधा का उपयोग करता हूं, तो परिणाम केवल दूसरी कॉल के लिए मुद्रित किया जाता है।

निम्नलिखित दृष्टांत देखें:

library(data.table)
mydt <- data.table(x = 1:3, y = 5:7)

myfunction <- function(dt) {
    dt[, z := y - x]
    dt
}

जब मैं केवल फ़ंक्शन को कॉल करता हूं, तो तालिका मुद्रित नहीं होती है (जो मानक व्यवहार है। हालांकि, अगर मैं लौटे data.table को data.table एक नई वस्तु में, यह पहली कॉल पर मुद्रित नहीं होता है, केवल दूसरे के लिए।

myfunction(mydt)  # nothing is printed   
result <- myfunction(mydt) 
result  # nothing is printed
result  # for the second time, the result is printed
mydt                                                                     
#    x y z
# 1: 1 5 4
# 2: 2 6 4
# 3: 3 7 4 

क्या आप बता सकते हैं कि ऐसा क्यों होता है और इसे कैसे रोका जाए?


मुझे खेद है कि अगर मैं यहां कुछ पोस्ट नहीं करने वाला हूं तो इसका जवाब नहीं है, लेकिन मेरी पोस्ट एक टिप्पणी के लिए बहुत लंबी है।

मैं यह बताना चाहता हूं कि dst में जानसनदवेनी का एक अनुगामी [] जोड़ने का समाधान हमेशा अपेक्षित परिणाम नहीं देता है (यहां तक ​​कि डेटाटैब 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 expected

mydt  # 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 4

mydt  # 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 expected

mydt  # Nothing printed unexpectedly

df <- 1 बाद 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 expected

mydt  # Content printed as desired
##    x y z
## 1: 1 5 4
## 2: 2 6 4
## 3: 3 7 4




assignment-operator