Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中如何区分'alist'和'list'?_R - Fatal编程技术网

在R中如何区分'alist'和'list'?

在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

我试图将函数传递到另一个函数中进行求值。我希望保留函数的名称,因为我将在命名输出时使用它。在下面的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 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)

df
alist
不求值,
list
求值。它们不一样。如果您仍要使用
列表
,则必须引用:

l <- list(quote(min) ,quote(sum))
foo(df, l, 2)

[1] "Applying sum to the dataframe df"
[1] 6

l
alist
不进行计算,
list
进行计算。它们不一样。如果您仍要使用
列表
,则必须引用:

l <- list(quote(min) ,quote(sum))
foo(df, l, 2)

[1] "Applying sum to the dataframe df"
[1] 6

l
alist
返回一个列表:

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)