有一个名为" 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(":(")
} `
答案 0 :(得分:2)
以下几点将有助于对未来R的问题和理解。
print
已分配<强>解释强>
在R中,list
对象是一个可以容纳其他对象的特殊对象。它们几乎可以容纳任何东西,甚至其他列表!因为他们如此接受各种各样的东西,所以他们没有配备像矢量那样的所有酷炫功能。
向量是一个具有共同类型的简单R对象。 &#34;普通类型&#34;意味着整个向量将是数字,或字符值,或我们正在使用的任何其他类型。如果我们创建c(1,"a")
,我们会混合一个带有数字的字母。这两种类型将被强制为只有一种类型character
。定量功能不再适用于它。但是列表list(1,"a")
会将每个列表保存为自己的类型。
在您的情况下,您有一系列整数。当数字在向量中时,我们可以应用许多内置函数来处理它们,这些函数不适用于通用列表。 sum
,mean
和sd
等函数用于接受向量。但它们不适用于列表。我们应该将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(":(")
}
}
编辑:皮埃尔打败了我!离开,但皮埃尔有一个更彻底的答案。