使用' if' '为'区分数字

时间:2016-10-13 20:42:20

标签: r if-statement for-loop

有一个名为" G"我试图用微笑替换5以上的任何数字" :)和#34;符号和任何数字低于5的" :("。我写了这段代码,但期望只有五个微笑,结果完全不同,所有数字都出现微笑。谢谢,如果有人告诉我什么& #39;这个非常简单和基本的代码错了。

`G <- list(1,2,3,4,5,6,7,8,9,10) 
B <- for (i in 1:length(G))
if (any(G> 5)) {
print(":)")
}  else {
print(":(")
} `

2 个答案:

答案 0 :(得分:2)

以下几点将有助于对未来R的问题和理解。

  1. 列表与向量
  2. For loops vs. Vectorization
  3. print已分配
  4. <强>解释

    在R中,list对象是一个可以容纳其他对象的特殊对象。它们几乎可以容纳任何东西,甚至其他列表!因为他们如此接受各种各样的东西,所以他们没有配备像矢量那样的所有酷炫功能。

    向量是一个具有共同类型的简单R对象。 &#34;普通类型&#34;意味着整个向量将是数字,或字符值,或我们正在使用的任何其他类型。如果我们创建c(1,"a"),我们会混合一个带有数字的字母。这两种类型将被强制为只有一种类型character。定量功能不再适用于它。但是列表list(1,"a")会将每个列表保存为自己的类型。

    在您的情况下,您有一系列整数。当数字在向量中时,我们可以应用许多内置函数来处理它们,这些函数不适用于通用列表。 summeansd等函数用于接受向量。但它们不适用于列表。我们应该将G更改为向量:

    G <- c(1,2,3,4,5,6,7,8,9,10)
    #Or a bit shorter
    G <- 1:10
    

    For循环和矢量化

    在R中,因为向量只能是一种类型,所以很多很酷的东西都是可能的。我可以G + 1,R会为G的每个元素添加一个。它完成了没有循环的整个事情。对于像你这样的条件语句,我们也可以进行矢量化:

    ifelse(G > 5, ":)", ":(")
    

    使用作业打印

    可以保存print函数,但最好只是按原样捕获输出:

    #Don't do
    x <- print("hello")
    #Do
    x <- "hello"
    

    两者都有效,但第二种更符合R编程。 B未在您的情况下保存输出的原因是您尝试保存for循环本身。如果您想保存循环的输出,请在循环中执行,因为输出将在完成时转储。

    总结一下,我们可以简化为:

    G <- 1:10
    B <- ifelse(G > 5, ":)", ":(")
    #[1] ":(" ":(" ":(" ":(" ":(" ":)" ":)" ":)" ":)" ":)"
    

答案 1 :(得分:0)

跟进皮埃尔提到的内容:R中的列表与Python不同。你正在寻找的是一个向量,你可以阅读更多关于它们的here。您可以使用c()初始化矢量,例如:

test <- c(1,2,3,4,5,6,7,8,9,10)

您可以使用它的索引访问一个向量,方法是将其放在方括号[]中。例如,使用nouns <- c(“cat”, “dog”, “tree”)的向量nouns[2]将返回”dog”

您的代码的正常版本是:

G <- c(1,2,3,4,5,6,7,8,9,10) 
for (i in 1:length(G)) 
{                   #missed loop curly bracket on this line
    if (G[i] > 5) {
        print(":)") #if you want to assign the output of a loop do it here
    } else {
       print(":(")
    } 
}
编辑:皮埃尔打败了我!离开,但皮埃尔有一个更彻底的答案。