R 如何与函数一起使用/在函数内部使用?

R 如何与函数一起使用/在函数内部使用?,r,R,我很难理解为什么这不起作用 df <- data.frame(a=1:10, b=1:10) foo <- function(obj, col) { with(obj, ls()) with(obj, print(col)) } foo(df, a) 传递给函数的任何内容都必须是对象、字符串或数字。这有两个问题: 在本例中,您试图将“a”作为对象传递,而实际上您应该像字符串一样传递它 with(obj,ls())将返回函数环境(函数范围),而不是屏幕,除非您告诉它打印

我很难理解为什么这不起作用

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

foo <- function(obj, col) {
   with(obj, ls())
   with(obj, print(col))
}
foo(df, a)

传递给函数的任何内容都必须是对象、字符串或数字。这有两个问题:

  • 在本例中,您试图将“a”作为对象传递,而实际上您应该像字符串一样传递它
  • with(obj,ls())将返回函数环境(函数范围),而不是屏幕,除非您告诉它打印
  • 您想要的更像:

    foo <- function(obj, col) {
           print(with(obj, ls()))
           with(obj, print(obj[[col]]))
        }
    
    foo(df, "a")
    

    foo
    with
    在交互环境中使用方便,提高了可读性,但在编程环境中,您将东西来回传递给函数并在不同环境中处理东西时,可能会伤害您的大脑。一般来说,在R中,使用符号而不是名称是一种“语义糖”,在交互使用中方便易读,但在编程中有点不推荐使用[例如,
    $
    子集
    ]。如果您愿意在使用名称(
    “a”
    )而不是符号(
    a
    )方面妥协,那么我建议您回到更简单的
    obj[[col]]
    ,而不是在这里使用
    with

    因此,作为一个独立的答案:

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

    foo函数内参数col在与一起使用函数内参数(与交互使用相反)之前进行计算。这里有两种解决这个问题的方法

    foo1 <- function(obj, col) {
              with(obj, print(eval(col)))
            }
    foo1(mydf, quote(a))# here you have to remember to quote argument
    
    
    foo2 <- function(obj, col) {
              col <- as.expression(as.name(substitute(col)))#corrected after DWIN comment
              with(obj, print(eval(col)))
            }
    foo2(mydf, a)# this function does all necessary stuff
    

    foo1对你想要完成的事情有一个更广泛的背景可能会有所帮助。但那不是他想要的:他想要打印df$a。他想要打印什么还不清楚。在我看来,他好像想要印两行字。一个具有obj的ColName,另一个具有指定列的内容。已删除我的答案,因此您可能希望更改引用。和+1的警告。谢谢所有的答案。我并不是真的想打印任何东西,我只是想能够将列传递给其他函数。看看像subset这样的函数,它们将列作为变量名,而不是字符串,我认为这样做很容易。我想我会坚持传递字符串。:)除非在函数中使用子集是一种糟糕的形式,因为如果列不符合您的预期,您将收到令人困惑的错误消息-最好使用直接子集。+1来回答提出的问题,尽管我仍然认为以这种方式处理/eval/等是一个坏主意…我无法让第二个操作正常。通常,在使用
    eval
    时,需要指定一个环境。
    foo <- function(object,col) {
       print(names(object))
       print(object[[col]])
    }
    
    foo <- function(object,col) {
       print(names(object))
       print(object[col])
    }
    
    foo1 <- function(obj, col) {
              with(obj, print(eval(col)))
            }
    foo1(mydf, quote(a))# here you have to remember to quote argument
    
    
    foo2 <- function(obj, col) {
              col <- as.expression(as.name(substitute(col)))#corrected after DWIN comment
              with(obj, print(eval(col)))
            }
    foo2(mydf, a)# this function does all necessary stuff