【发布时间】:2016-02-03 01:09:45
【问题描述】:
我有两个函数,每个函数都返回两个值(作为列表)并且在有限域上运行:
# for x >= 0
f <- function(x) { return(list(a=x,b=2*x)) }
# for x < 0
g <- function(x) { return(list(a=x/2,b=x/4)) }
我想做这样的事情:
fg <- function(x) { return(ifelse(x < 0, g(x), f(x))) }
我想得到这个:
> fg(c(1,2))
a$
[1] 1 2
b$
[2] 2 4
> fg(c(-1,-2)
a$
[1] -0.5 -1.0
b$
[2] -0.25 -0.50
相反,我得到了这个:
> fg(c(1,2))
[[1]]
[1] 1 2
[[2]]
[1] 2 4
> fg(c(-1,-2))
[[1]]
[1] -0.5 -1.0
[[2]]
[1] -0.25 -0.50
“$a”和“$b”标签丢失了。
单输入,情况就更糟了:
> fg(1)
[[1]]
[1] 1
我做错了什么?
我怎样才能实现我的目标?
【问题讨论】:
-
不知道为什么你会收到
0。我用 R 3.2.2 得到1。不管怎样,试试x=1; ifelse(x > 0, 1:10, 1:5)。如您所见,ifelse只返回第一个元素。此时您应该只使用常规的if-loop:fg <- function(x) if ( x < 0) g(x) else f(x) -
如果
x可以有多个元素,你可以试试:fg <- function(x) sapply(x, function(y) if (y < 0) g(y) else f(y), simplify=FALSE)。 -
ifelse 返回一个与 test 形状相同的值.....
-
我认为最好用适当的样本输入和预期输出来修改问题。
标签: r