首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我申请和如果其他在一起没有按预期工作

我申请和如果其他在一起没有按预期工作
EN

Stack Overflow用户
提问于 2021-01-20 13:27:42
回答 2查看 114关注 0票数 1

我正在写一篇关于R的文档,我想出了一个我无法理解的例子。让我们这样说:

代码语言:javascript
运行
复制
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索引一样。有人能告诉我这背后的逻辑吗?我应该输入什么呢?非常感谢。最好的,大卫

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-01-20 13:38:18

问题是条件只创建一个TRUE,而是尝试如下所示:

代码语言:javascript
运行
复制
#Code
lapply(1:length(mylist),
       function(x) ifelse(lapply(mylist[[x]],is.numeric),
                          mylist[[x]]*2, mylist[[x]]))

问题是矩阵结构将丢失,因此@G.Grothendieck的答案将是一个更好的选择。

票数 0
EN

Stack Overflow用户

发布于 2021-01-20 13:37:42

1)如果,我们想要if,而不是ifelse。还对代码进行了一些简化。

代码语言:javascript
运行
复制
f <- function(x) if (is.numeric(x)) x*2 else x
lapply(mylist, f)

给予:

代码语言:javascript
运行
复制
[[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将自动分派适当的方法。

代码语言:javascript
运行
复制
dble <- function(x, ...) UseMethod("dble")
dble.numeric <- function(x, ...) 2 * x
dble.default <- function(x, ...) x

lapply(mylist, dble)

3) tryCatch不使用if的另一种方法是将参数加倍,如果它引发错误,则捕获它。同样,在这种情况下,这可能太复杂了,但它说明了如果实际情况更加复杂,可以做些什么。

代码语言:javascript
运行
复制
f2 <- function(x) tryCatch(2 * x, error = function(e) x)
lapply(mylist, f2)

4) rrapply rrapply包中的rrapply函数可以指定这样一个条件,即该函数只应用于满足它的元素。

代码语言:javascript
运行
复制
library(rrapply)

rrapply(mylist, is.numeric, function(x) 2 * x)

5) modify_if purrr包还有一个函数,它只修改满足条件的元素。

代码语言:javascript
运行
复制
library(purrr)

modify_if(mylist, is.numeric, `*`, 2)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65810486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档