在R中如何区分'alist'和'list'?
我试图将函数传递到另一个函数中进行求值。我希望保留函数的名称,因为我将在命名输出时使用它。在下面的MWE中,我只打印名称。如果我将函数作为在R中如何区分'alist'和'list'?,r,R,我试图将函数传递到另一个函数中进行求值。我希望保留函数的名称,因为我将在命名输出时使用它。在下面的MWE中,我只打印名称。如果我将函数作为列表传递,而不是作为列表传递,则可以执行此操作 df <- data.frame(x=1:3) foo <- function(df, a, i) { # Insert a check along the lines of is.alist(a) here print(paste('Applying', a[[i]], 'to the da
列表
传递,而不是作为列表
传递,则可以执行此操作
df <- data.frame(x=1:3)
foo <- function(df, a, i) {
# Insert a check along the lines of is.alist(a) here
print(paste('Applying', a[[i]], 'to the dataframe df'))
result <- eval(a[[i]])(df)
return(result)
}
a <- alist(min, sum)
foo(df, a, 2)
l <- list(min,sum)
foo(df, l, 2)
dfalist
不求值,list
求值。它们不一样。如果您仍要使用列表
,则必须引用:
l <- list(quote(min) ,quote(sum))
foo(df, l, 2)
[1] "Applying sum to the dataframe df"
[1] 6
lalist
不进行计算,list
进行计算。它们不一样。如果您仍要使用列表
,则必须引用:
l <- list(quote(min) ,quote(sum))
foo(df, l, 2)
[1] "Applying sum to the dataframe df"
[1] 6
lalist
返回一个列表:
identical(alist(min, sum),
list(quote(min), quote(sum)))
#[1] TRUE
无法测试列表是如何创建的。您可以测试列表元素的类型:
vapply(a, typeof, FUN.VALUE = "")
#[1] "symbol" "symbol"
vapply(l, typeof, FUN.VALUE = "")
#[1] "builtin" "builtin"
但我建议重新设计您的函数。我认为要求用户使用alist
alist
返回一个列表是不好的做法:
df <- data.frame(x=1:3)
foo <- function(df, a, i) {
# Insert a check along the lines of is.alist(a) here
print(paste('Applying', a[[i]], 'to the dataframe df'))
result <- eval(a[[i]])(df)
return(result)
}
a <- alist(min, sum)
foo(df, a, 2)
l <- list(min,sum)
foo(df, l, 2)
identical(alist(min, sum),
list(quote(min), quote(sum)))
#[1] TRUE
无法测试列表是如何创建的。您可以测试列表元素的类型:
vapply(a, typeof, FUN.VALUE = "")
#[1] "symbol" "symbol"
vapply(l, typeof, FUN.VALUE = "")
#[1] "builtin" "builtin"
但我建议重新设计您的函数。我认为要求用户使用alist
不是一个好的做法。如果需要一个命名列表,那么可以在打印语句中使用名称(a)[I]。谢谢。我希望他们传递一个函数列表,我不认为函数在列表中传递时有“名称”命名列表是这样的L如果需要命名列表,那么可以在print语句中使用名称(a)[I]。谢谢。我想让他们传递一个函数列表,我不认为函数在传递给列表时有“名称”命名列表是这样的L这是我的观点。我需要用户传递一个列表
,我想检查他们是否已经这样做了。我不能使用class(a)
,因为无论输入是list
还是list
,它都返回list
。这就是我的观点。我需要用户传递一个列表
,我想检查他们是否已经这样做了。我不能使用class(a)
,因为无论输入是list
还是list
,它都返回list
。谢谢。我想我需要一个单独的问题,但我努力寻找一种方法来传递一个函数而不丢失它的名称。我发现了这个,但是alist
似乎是另一种尝试。谢谢。我想我需要一个单独的问题,但我努力寻找一种方法来传递一个函数而不丢失它的名称。我发现了这一点,但alist
似乎是另一种尝试。
df <- data.frame(x=1:3)
foo <- function(df, a, i) {
# Insert a check along the lines of is.alist(a) here
print(paste('Applying', a[[i]], 'to the dataframe df'))
result <- eval(a[[i]])(df)
return(result)
}
a <- alist(min, sum)
foo(df, a, 2)
l <- list(min,sum)
foo(df, l, 2)