【问题标题】:For loop in R with key valueR中带有键值的for循环
【发布时间】:2013-09-02 12:08:41
【问题描述】:

R中的等价方式是什么

foreach ($arr as $key => $value) {
    echo "Key: $key; Value: $value<br />\n";
}

意思是

arr<-c(a=1,b=2,c=3)
key<-names(arr)
val<-arr
for(i in 1:length(arr)){
 print(paste(key[i],val[i]))
}

【问题讨论】:

  • 我看到的唯一区别是您的输出格式不同,可以通过使用paste() 中的字符串参数轻松修改。如果不是这样,问题似乎并不完全清楚。
  • 我不明白。您提供的代码也会生成键值对吗?那么缺少什么?
  • @Dr.Mike:我认为他正在寻找一种更优雅的方式来编写这个循环。
  • @f3lix 谢谢你的理解,我已经学习了 R。我通过编写代码的经验是我经常使用 PHP 和 Java 等语言,如果我需要一个 lapply,我现在看到了不同之处在 for 循环中,我知道循环在矢量语言中是坏事。

标签: r loops


【解决方案1】:

假设var是一个键值对的列表,一个更通用的foreach循环可以用下面的sn-p实现:

for(key in names(var)){
  value<-var[key]
  print(paste(key,'=',value))
}

【讨论】:

    【解决方案2】:

    使用foreach 你可以写:

    foreach(key=names(arr), val=arr) %do% print(paste(key,val))
    

    你可以定义你自己的forkeyval函数:

    forkeyval = function(arr, .combine=function(...){NULL}, ...) {
                    foreach(key=names(arr), val=arr, .combine=.combine, ...) }
    

    让你写作:

    forkeyval(arr) %do% print(paste(key,val)
    

    【讨论】:

    • 虽然我喜欢 foreach 包,但我认为我的 kv 包为 OP 问题提供了更自然的语法解决方案。
    【解决方案3】:

    R 喜欢将事物向量化。你可以这样做:

    sprintf("Key: %s; Value: %s", names(arr), arr)
    # [1] "Key: a; Value: 1" "Key: b; Value: 2" "Key: c; Value: 3"
    

    或者为了更好的输出,通过cat:

    cat(sprintf("Key: %s; Value: %s", names(arr), arr), sep = "\n")
    # Key: a; Value: 1
    # Key: b; Value: 2
    # Key: c; Value: 3
    

    【讨论】:

    • 我知道用向量来思考会更好,但计算更复杂,你可以为this 提供更好的解决方案,我会决定是否可以使用这个原理解决我现在在做什么。
    • 你链接到的是一个完全不同的问题。对于您在这里提出的问题,我提供了我和大多数人都会认为正确的答案。当你开始掌握 R 时,也许你会意识到它并不是“更复杂”,而是恰恰相反:更少的按键、更少的函数调用,而且运行速度更快。
    • 以更一般的方式查看链接,在第 2 点下完全一样。
    【解决方案4】:

    您也可以使用kv 包中的kv()。它的重量非常轻,与基本 R 语法几乎没有区别。

    for( . in kv(arr) ) {
      cat( "Key:", .$k, "Value:", .$v, "<br />\n" ) 
    }
    

    披露:我写了 kv

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      相关资源
      最近更新 更多