Using setDF() within a function will not modify global object, while setDT() does?

Open
#4,816 14 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

  • #4901 by @OfekShilon — closed without merging

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
r
Domain
data

Research direction

Start by running the provided iris and fo() reprex to compare setDT() and setDF() inside and outside a function. Trace how each function affects the input and returned object; done means the documented workflow has consistent, verified behavior or the issue clearly explains the intended limitation.

Written by the indexing model from the issue text.

Description

question

Note: this was first asked on stack, but asking here as it seems highly technical?

I am converting back and forth from data.frame to data.table using a workflow like: setDT() + some data.table operation + setDF() (see this post). Using setDF() will correctly transform back my input into a data.frame.

However, when I use exactly the same code, but within a function, the input is not transformed back into an data.frame anymore after a setDF() call, while the output will still correctly be converted to a df. I guess this comes from am ambiguity at that point whether the object of setDF() refers to the local data within the function or the global data in the user workspace? Strangely, this does not happen to setDT()?

So how can I ensure that I can use the workflow setDT() + some data.table operation + setDF() within a function, and that setDF() modifies back the input to that function?

library(data.table)
data(iris)

## using setDF outside of function
setDT(iris)
iris[, Sepal.Length.Mean := mean(Sepal.Length), by = Species]
setDF(iris)

class(iris)
#> [1] "data.frame"

## using setDF within a function
fo <- function(df){
  setDT(df)
  df[, Sepal.Length.Mean := mean(Sepal.Length), by = Species]
  setDF(df)
  df
}

res <- fo(iris)
class(iris)
#> [1] "data.table" "data.frame"

Created on 2020-11-17 by the reprex package (v0.3.0)

Dominant language
R
Stars
3.9k
Forks
1.1k
Avg merge
14h 4m
Merged PRs (30d)
4

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from Rdatatable/data.table

All issues in Rdatatable/data.table

Similar issues

More R issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.