繁体   English   中英

如何使用列表项作为 R 循环中函数的输入?

[英]How can I use items of a list as input for a function in a loop in R?

我是 R 和 stackoverflow 的新手,所以请原谅我的幼稚和可能的错误。 我的目标是为以太坊交易创建交易细节数据框。 我用于单笔交易的功能是:

library(devtools)
library(etherscanr)

devtools::install_github("dirkschumacher/etherscanr")
etherscan_transactions("0x3cd751e6b0078be393132286c442345e5dc49699")

函数括号中的数字是我需要详细信息的钱包地址。 到目前为止,一切都很好。 这工作得很好。 但是,我需要为数千个地址执行此操作,这就是为什么我想在列表中循环此函数。 这就是我卡住并寻求您的帮助的地方。 我尝试了不同的方法,包括 lapply 和 for 循环,看起来像这样:

transto <- transaction_sample$to

for(i in 1:length(transto)) {
  transtodetail <- etherscan_transactions(i)
}

这是我得到的错误: etherscan_transactions(i) 中的错误:is.character(account) is not TRUE

这是钱包地址列表的样子:

 head(transto)
[1] "0x3cd751e6b0078be393132286c442345e5dc49699"
[2] "0xdac17f958d2ee523a2206206994597c13d831ec7"
[3] "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599"
[4] "0xdac17f958d2ee523a2206206994597c13d831ec7"
[5] "0xdac17f958d2ee523a2206206994597c13d831ec7"
[6] "0xdac17f958d2ee523a2206206994597c13d831ec7"
    

我很感激任何类型的提示。

  #' The data:
transto <- c("0x3cd751e6b0078be393132286c442345e5dc49699",
             "0xdac17f958d2ee523a2206206994597c13d831ec7",
             "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
             "0xdac17f958d2ee523a2206206994597c13d831ec7",
             "0xdac17f958d2ee523a2206206994597c13d831ec7",
             "0xdac17f958d2ee523a2206206994597c13d831ec7")

使用etherscan_transactions的修改/伪造版本会告诉您发生了什么:

fake_etherscan_transactions <- function(i_arg) print(i_arg)

for(i in 1:length(transto)) {
  transtodetail <- fake_etherscan_transactions(i)
}
#> [1] 1
#> [1] 2
#> [1] 3
#> [1] 4
#> [1] 5
#> [1] 6

您将索引传递给etherscan_transactions()而不是每个索引处的值。

这里有一些解决方案。 只需将fake_etherscan_transactions替换为etherscan_transactions 解决方案1:使用索引

for(i in 1:length(transto)) {
  transtodetail <- fake_etherscan_transactions(transto[i])
}
#> [1] "0x3cd751e6b0078be393132286c442345e5dc49699"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"
#> [1] "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"

解决方案2:在for循环中使用transto作为向量

for(i in transto) {
  transtodetail <- fake_etherscan_transactions(i)
}
#> [1] "0x3cd751e6b0078be393132286c442345e5dc49699"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"
#> [1] "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"
#> [1] "0xdac17f958d2ee523a2206206994597c13d831ec7"

解决方案 3:在transto sapply如@Limey 建议的那样)。

sapply(transto, fake_etherscan_transactions)

reprex 包于 2022-06-11 创建 (v2.0.1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM