-2

我有一个关于 R 函数式编程的基本问题。

给定一个返回列表的函数,例如:

myF <- function(x){
   return (list(a=11,b=x))
}

为什么在使用范围或向量调用函数时返回的列表对于“a”总是相同的长度 例如:

myF(1:10)

返回:

$a
[1] 11

$b
[1]  1  2  3  4  5  6  7  8  9 10

如何改变行为以使“a”列表的样本长度为 b。

我实际上正在使用一堆 S4 对象,这些对象我无法轻松转换为列表(使用 as.list),因此 _apply 不是我的首选。

感谢您的任何见解或帮助!

编辑(添加了进一步的解释)我不一定只想填充“a”以使其长度等于 b。但是,使用解决方案 as.list(data.frame(a=myA,b=x)) 用首先计算的相同值填充“a”。

myF <- function(x){
  myA = ceiling(runif(1, max=100))
  return (as.list(data.frame(a=myA
               ,b=x)))
}

myF(1:5)
$a
 [1] 79 79 79 79 79 79 79 79 79 79

$b
 [1]  1  2  3  4  5  6  7  8  9 10

我仍然不确定为什么会这样!

谢谢

4

4 回答 4

2

您是否只是希望重复 11 个以使 a 与 b 的长度相同?如果是这样:

> myF <- function(x){
+    return (list(a=rep(11,length(x)),b=x))
+ }
> myF(1:10)
$a
 [1] 11 11 11 11 11 11 11 11 11 11

$b
 [1]  1  2  3  4  5  6  7  8  9 10

根据 OP 的澄清/评论进行编辑。如果您希望“a”改为长度等于“b”的随机向量:

> myF <- function(x){
+    return (list(a=ceiling(runif(length(x),max=100)),b=x))
+ }
> myF(1:10)
$a
 [1]  4 31  8 45 25 74 36 95 64 32

$b
 [1]  1  2  3  4  5  6  7  8  9 10
于 2012-07-09T22:17:56.923 回答
1

我不太明白你不能使用 as.list 是什么意思。通过执行以下操作,您应该能够获得满足列表的所有组件长度相同的要求的函数版本:

myF <- function(x){
   return as.list(data.frame(a=11,b=x))
}

编辑:原因list不能按您期望的方式工作,因为list应用于许多列表/向量/等就是这样,这些列表/向量/等的列表;它不会“检查”它们的结构。

我认为您想要的是列表中包含的向量应该匹配并产生一组“行”的附加语义,每个“行”都有一个来自每个向量的对应元素。这正是假设的数据框(实际上,我认为数据框是如何在 R 中表示的)。最后的as.list调用只改变了它标记为的类型。

EDIT2:请注意,如果我在上面错了(这不是您想要的一般行为),那么 Mac 的解决方案更合适,因为它为您提供了两个向量应该具有相同长度的行为,而不暗示它们应该“排队”。

这会让任何阅读代码的人感到困惑(因为使用 data.frame 意味着您认为您的向量是匹配的)以及强制您添加到列表中的任何其他元素转换为适当长度的向量(这可能是也可能不是你想要的)

于 2012-07-09T22:17:57.583 回答
1

如果我上次没有正确理解您,这里还有另一种可能性:

如果您想生成第二个向量,给定一些函数/表达式,与您的参数长度相同,您可以执行以下操作:

myF <- function(x){
   return (list(a=replicate(length(x),f),b=x))
}

在您的示例中f可能是runif(1, max=100),尽管在特定情况下您可以通过在函数内部runif调用来明确告诉它生成适当长度的向量。runif(length(x), max=100)

replicate只需重新评估f您请求的次数,并为您提供所有结果的向量。

于 2012-07-09T23:37:55.593 回答
0

看来您的功能是“硬编码” a。因此,无论您指定什么,它总是会给出 11。

例如,如果您将功能更改为:

myF <- function(x){    return (list(a=x,b=x)) }

myF(1:10) 

$a
 [1]  1  2  3  4  5  6  7  8  9 10

$b
 [1]  1  2  3  4  5  6  7  8  9 10

a 可以像 b 一样改变。

或者

myF <- function(x,y){    return (list(a=y,b=x)) }

myF(10:1,1:10) 
$a
 [1]  1  2  3  4  5  6  7  8  9 10

$b
 [1] 10  9  8  7  6  5  4  3  2  1

现在允许 a 独立于 b 改变。

于 2012-07-09T22:29:07.740 回答