我正在写一篇关于R的文档,我想出了一个我无法理解的例子。让我们这样说:
mylist <- list(8, 1:10, c(4,7,25), matrix(1:30, ncol = 5), "my name is not Donald")
lapply(1:length(mylist), function(x) ifelse(is.numeric(mylist[[x]]),
mylist[[x]]*2, mylist[[x]]))我本来希望我的列表中的数字元素是2折叠的,而字符向量则是a。相反,列表中数值元素的结果只是每个元素的第一个组件,就好像ifelse的真正条件(即1)已经接管了lapply的x索引一样。有人能告诉我这背后的逻辑吗?我应该输入什么呢?非常感谢。最好的,大卫
发布于 2021-01-20 13:38:18
问题是条件只创建一个TRUE,而是尝试如下所示:
#Code
lapply(1:length(mylist),
function(x) ifelse(lapply(mylist[[x]],is.numeric),
mylist[[x]]*2, mylist[[x]]))问题是矩阵结构将丢失,因此@G.Grothendieck的答案将是一个更好的选择。
发布于 2021-01-20 13:37:42
1)如果,我们想要if,而不是ifelse。还对代码进行了一些简化。
f <- function(x) if (is.numeric(x)) x*2 else x
lapply(mylist, f)给予:
[[1]]
[1] 16
[[2]]
[1] 2 4 6 8 10 12 14 16 18 20
[[3]]
[1] 8 14 50
[[4]]
[,1] [,2] [,3] [,4] [,5]
[1,] 2 14 26 38 50
[2,] 4 16 28 40 52
[3,] 6 18 30 42 54
[4,] 8 20 32 44 56
[5,] 10 22 34 46 58
[6,] 12 24 36 48 60
[[5]]
[1] "my name is not Donald"2) S3,尽管在这种情况下这可能有点过于复杂,但是如果我们有一组更大的类,这将是有用的,而且它还表明,不需要使用S3的任何if就可以做到这一点。为此,我们使用数值和默认方法定义一个S3泛型,然后S3将自动分派适当的方法。
dble <- function(x, ...) UseMethod("dble")
dble.numeric <- function(x, ...) 2 * x
dble.default <- function(x, ...) x
lapply(mylist, dble)3) tryCatch不使用if的另一种方法是将参数加倍,如果它引发错误,则捕获它。同样,在这种情况下,这可能太复杂了,但它说明了如果实际情况更加复杂,可以做些什么。
f2 <- function(x) tryCatch(2 * x, error = function(e) x)
lapply(mylist, f2)4) rrapply rrapply包中的rrapply函数可以指定这样一个条件,即该函数只应用于满足它的元素。
library(rrapply)
rrapply(mylist, is.numeric, function(x) 2 * x)5) modify_if purrr包还有一个函数,它只修改满足条件的元素。
library(purrr)
modify_if(mylist, is.numeric, `*`, 2)https://stackoverflow.com/questions/65810486
复制相似问题