How to use with/within inside a function?

前端 未结 3 1462
[愿得一人]
[愿得一人] 2020-12-10 07:30

I\'m struggling to understand why does this doesn\'t work.

df <- data.frame(a=1:10, b=1:10)

foo <- function(obj, col) {
   with(obj, ls())
   with(obj         


        
3条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-10 07:33

    with is handy and improves readability in an interactive context but can hurt your brain in a programming context where you are passing things back and forth to functions and dealing with things in different environments. In general within R, using symbols rather than names is a sort of "semantic sugar" that is convenient and readable in interactive use but mildly deprecated for programming [e.g. $, subset]). If you're willing to compromise as far as using a name ("a") rather than a symbol (a) then I would suggest falling back to the simpler obj[[col]] rather than using with here ...

    So, as a self-contained answer:

    foo <- function(object,col) {
       print(names(object))
       print(object[[col]])
    }
    

    If you wanted to allow for multiple columns (i.e. a character vector)

    foo <- function(object,col) {
       print(names(object))
       print(object[col])
    }
    

    edit: refraining from using subset with a function, at @hadley's suggestion

    (this will print the answer as a data frame, even if a single column is selected, which may not be what you want).

提交回复
热议问题