我有一个嵌套列表,其基本元素是数据帧,我想递归遍历此列表以对每个数据帧进行一些计算,最后得到与输入结构相同的嵌套结果列表.我知道"rapply"正是为了这样的任务,但我遇到了一个问题,rapply实际上比我想要的更深,即它分解每个数据帧并应用于每一列(因为数据帧本身就是一个列表)在R).
我能想到的一个解决方法是将每个数据帧转换为矩阵,但它会强制统一数据类型,所以我真的不喜欢它.我想知道是否有任何方法可以控制rapply的递归深度.任何的想法?谢谢.
我想知道为什么当检索不存在的行名时两个数据框会产生不同的结果a。b例如,
a <- as.data.frame(matrix(1:3, ncol = 1, nrow = 3, dimnames = list(c("A1", "A10", "B"), "V1")))
a
V1
A1 1
A10 2
B 3
b <- as.data.frame(matrix(4:5, ncol = 1, nrow = 2, dimnames = list(c("A10", "B"), "V1")))
b
V1
A10 4
B 5
Run Code Online (Sandbox Code Playgroud)
让我们尝试从数据框中获取“A10”、“A1”、“A” a:
> a["A10", 1]
[1] 2
> a["A1", 1]
[1] 1 # expected
> a["A", 1]
[1] NA # expected
> a["B", 1]
[1] 3 # expected
> a["C", 1] …Run Code Online (Sandbox Code Playgroud) 我想创建一个嵌套列表,例如,
> L <- NULL
> L$a$b <- 1
> L
$a
$a$b
[1] 1
Run Code Online (Sandbox Code Playgroud)
因为我需要在循环中进行赋值,所以我必须使用括号而不是美元,例如,
> L <- NULL
> a <- "a"
> b <- "b"
> L[[a]][[b]] <- 1
> L
a
1
> b <- "b1"
> L[[a]][[b]] <- 1
Error in L[[a]][[b]] <- 1 :
more elements supplied than there are to replace
Run Code Online (Sandbox Code Playgroud)
这超出了我的预期:L成为命名向量而不是嵌套列表.但是,如果指定的值是长度超过1的向量,则问题将消失,
> L <- NULL
> L[[a]][[b]] <- 1:2
> L
$a
$a$b
[1] 1 2
> b <- "b1"
> L[[a]][[b]] …Run Code Online (Sandbox Code Playgroud) 我想创建一个 rust 程序,它通过管道从外部程序输入并通过管道吐到另一个外部程序,就像三明治一样。更具体地说,我尝试创建的玩具模型是“gzip -cd input | rust | gzip -c -> output”。
基本上,我知道如何做第一部分(管道输入),例如:
let child = match Command::new("zcat")
.args(&["input"])
.stdout(Stdio::piped())
.stderr(Stdio::null())
.spawn();
let filehand = BufReader::new(child.stdout.unwrap());
for line in filehand.lines() {
...
}
Run Code Online (Sandbox Code Playgroud)
但是我被困在第二部分,也不知道如何将两者拼凑起来。我知道 Perl 可以以优雅的方式做到这一点:
open filehand_in, "gzip -cd input |";
open filehand_out, "| gzip -c - > output";
while ( <filehand_in> ) {
# processing;
print filehand_out ...;
}
Run Code Online (Sandbox Code Playgroud)
我所说的优雅是指进出的外部处理对主程序是透明的:您只需要将第一个管道视为标准输入,将第二个管道视为标准输出,无需再担心。我想知道是否有人知道如何在 Rust 中实现类似的实现,谢谢。