【问题标题】:Double for loops in R and PythonR 和 Python 中的双重 for 循环
【发布时间】:2022-01-02 10:22:26
【问题描述】:

我正在尝试在 R 中转换 Python 中的双 for 循环。当我在粘贴函数中使用它时,它可以正常工作。我试图弄清楚为什么没有它就无法访问这些。

在 Python 中

l1 = ['appetizer','main course']
l2 = ['italian','mexican','french']

for i in l1:
    for j in l2:
        print(i,j)

在R中

l1 = list('appetizer','main course')
l2 = list('italian','mexican','french')

这会引发错误

for (i in l1) {
  for (j in l2) {
    print(i,j)
  }
}

错误

Error in print.default(i, j) : invalid 'digits' argument
In addition: Warning message:
In print.default(i, j) : NAs introduced by coercion
> for (i in l1) {

这不会引发错误

for (i in l1) {
  for (j in l2) {
    print(paste(i,j,sep=","))
  }
}

输出

[1] "appetizer,italian"
[1] "appetizer,mexican"
[1] "appetizer,french"
[1] "main course,italian"
[1] "main course,mexican"
[1] "main course,french"

【问题讨论】:

  • 因为正如错误所说,“italian”对于digits 是无效的数字参数。您似乎期望 python 中的print 和 r 出于某种原因是相同的

标签: python r for-loop


【解决方案1】:

索引之间存在差异。 Python 将向量(数组)作为索引传递,而 R 传递值。请注意,索引以 1 开头,即 1, 2, ..., n。您还需要concatenate 要打印的对象,将它们作为单个参数传递。因此,您可以执行以下操作:

l1 <- list('appetizer', 'main course')
l2 <- list('italian', 'mexican', 'french')

for (i in seq_along(l1)) {
  for (j in seq_along(l2)) {
    print(c(l1[[i]], l2[[j]]))
  }
}
# [1] "appetizer" "italian"  
# [1] "appetizer" "mexican"  
# [1] "appetizer" "french"   
# [1] "main course" "italian"    
# [1] "main course" "mexican"    
# [1] "main course" "french"  

【讨论】:

    【解决方案2】:

    请参阅下面对print 方法的说明。

    print(x, digits = NULL, quote = TRUE,
      na.print = NULL, print.gap = NULL, right = FALSE,
      max = NULL, useSource = TRUE, …)
    
    x       the object to be printed.
    
    digits  a non-null value for digits specifies the minimum number of 
            significant digits to be printed in values. The default, NULL, uses 
            getOption("digits"). (For the interpretation for complex numbers see 
            signif.) Non-integer values will be rounded down, and only values 
            greater than or equal to 1 and no greater than 22 are accepted.
    ...
    

    显然第二个变量不被接受为有效参数。

    虽然这有点奇怪,但更重要的一点是 print(a,b) 不是打印多个值的语法正确方法。

    所以你可以继续使用paste()函数

    或者像print(c(l1[[i]], l2[[j]]))这样的索引

    【讨论】:

    • 为什么这么奇怪? "italian" 不被接受为数字参数的值是有道理的
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2018-02-16
    • 2020-10-18
    相关资源
    最近更新 更多