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)
传递给函数的任何内容都必须是对象、字符串或数字。这有两个问题:
foo <- function(obj, col) {
print(with(obj, ls()))
with(obj, print(obj[[col]]))
}
foo(df, "a")
foowith
在交互环境中使用方便,提高了可读性,但在编程环境中,您将东西来回传递给函数并在不同环境中处理东西时,可能会伤害您的大脑。一般来说,在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