Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.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 避免apply()中的简化_R_Apply - Fatal编程技术网

R 避免apply()中的简化

R 避免apply()中的简化,r,apply,R,Apply,这个问题很简单 在apply()中是否有避免简化的方法 我之所以需要这样做,是因为我有一个apply,它有时可以简化(它确实做到了),有时则不能,从而根据输入创建不同的数据结构,所以我希望完全避免它 我需要类似于mapply()中的SIMPLIFY=FALSE的东西,或者像vapply()中那样控制输出的机制 简单的可复制示例: mimat <- matrix(c(1,2,3,4,5,6), nrow = 2) mimat2 <- matrix(c(3,2,3,4,5,6), nr

这个问题很简单

apply()
中是否有避免简化的方法

我之所以需要这样做,是因为我有一个
apply
,它有时可以简化(它确实做到了),有时则不能,从而根据输入创建不同的数据结构,所以我希望完全避免它

我需要类似于
mapply()
中的
SIMPLIFY=FALSE
的东西,或者像
vapply()
中那样控制输出的机制


简单的可复制示例:

mimat <- matrix(c(1,2,3,4,5,6), nrow = 2)
mimat2 <- matrix(c(3,2,3,4,5,6), nrow = 2)

apply(mimat, MARGIN = 2, function(x) { 
                              if (is.element(el = 1, x)) return(c(0,1))
                              else return(c(1,2,3))
      })
mimat截至,R-devel为
apply()
提供了一个
simplify
参数

在达到R版本之前,最好的选择可能是

lappy(seq_len(dim(minat)[2]),您的功能)

我认为对于您的目的,
purr
包中的函数可能更合适,因为输出几乎是事先知道的。如果他们不能将输出与他们应该返回的数据结构相匹配,他们就会抛出错误(或者像文档中所说的那样死掉)

例如,
map
函数总是返回一个列表,而其变体
map\u dbl
map\u lgl
等都返回指定类型的向量

在这个系列中还有另一个名为
modify
的函数,它保留输入数据的结构(行号和列号),并且不改变数据结构,但是文档中说

因为转换可以改变输入的结构;它是 您有责任确保转换生成有效的 输出。例如,如果要修改数据帧,.f必须 保留输入的长度

在您的第一个示例中,当您将匿名函数应用于
mimat
时,结果具有不同的长度,因此无法返回矩阵或数据帧,因为我可以使用
map
进行尝试以获得相同的结果,而
modify
无法保留输入的数据结构:

library(purrr)

map(as.data.frame(mimat), function(x) { 
  if (is.element(el = 1, x)) return(c(0,1))
  else return(c(1,2,3))
})

$V1
[1] 0 1

$V2
[1] 1 2 3

$V3
[1] 1 2 3

modify(as.data.frame(mimat), function(x) { 
  if (is.element(el = 1, x)) return(c(0,1))
  else return(c(1,2,3))
})

> Error in `[[<-.data.frame`(`*tmp*`, i, value = c(1, 2, 3)) :   
> replacement has 3 rows, data has 2

我必须将它们转换为数据帧,否则它们将被视为向量,函数将应用于每个元素,而不仅仅是列。 这个简短的解释可能无法让您了解您想要的内容,但我希望它只是对其他一些具有固定输出的函数的介绍。
简而言之,它只归结为您在数据结构上应用的函数,该函数必须以能够保留数据结构的方式转换数据。

您应该提供一个示例。你可以在这里寻找一个可能的解决方案:简短的回答:不,没有。将
apply
与可能返回可变长度向量的函数一起使用是危险的。更好的方法是使用
for
循环(或者将矩阵强制为data.frame,然后在可行的情况下调用
lappy
)。您可以将返回向量包装在
list
中,如下所示:
返回(list(c(0,1))
,然后您将始终得到一个列表。@JohnPaul如果您这样做,您将得到一个列表列表列表,这就是一件事,但仍然不是我想要的。无论如何,我想我应该避免使用
apply()
map_dfc(as.data.frame(mimat2), function(x) { 
  if (is.element(el = 1, x)) return(c(0,1))
  else return(c(1,2,3))
})

# A tibble: 3 x 3
     V1    V2    V3
  <dbl> <dbl> <dbl>
1     1     1     1
2     2     2     2
3     3     3     3

modify(as.data.frame(mimat2), function(x) { 
  if (is.element(el = 1, x)) return(c(0,1))
  else return(c(1,2,3))
})

Error in `[[<-.data.frame`(`*tmp*`, i, value = c(1, 2, 3)) : 
  replacement has 3 rows, data has 2