R循环 - 如何正确使用它?

时间:2015-05-23 14:08:13

标签: php r for-loop shiny

我来自PHP背景,仍然试图了解R。

例如,我可以轻松地在PHP中循环数组并操纵数据,

$array = [
  "site1"   => 9
  "site2"   => 10
  "site3"   => 18
  "site4"   => 28
]

foreach($array as $index => $id) {
   echo $id . '<br/>'; 
}

结果,

9 
10 
18 
28

但在R中,我有这个数据框,例如,

    siteKey siteCode
1   site1   9
2   site2   10
3   site3   18
4   site4   28

环,

for(i in 1:length(sites.df$siteKey)) {
    print(sites.df$siteCode)
}

结果,

[1] "9"  "10" "18" "28"
[1] "9"  "10" "18" "28"
[1] "9"  "10" "18" "28"
[1] "9"  "10" "18" "28"

我认为应该是这个结果?

"9"  
"10" 
"18" 
"28"

知道如何使用R循环获得我需要的结果吗?

修改

查询,

  # Prepare SQL query1.
  dataQuery <- "SELECT 
                *
            FROM speckdata AS s

            LEFT JOIN weatherunderground AS w 
            ON s.wid_timestamp = w.wid_timestamp

            LEFT JOIN nodes AS n 
            ON n.nid = s.nid
            AND n.datatype = 'speck'

            WHERE n.nid = 'SITE'
            "

也许最好循环下面这个?

  #
  # Data: site 1
  #

  # Match the pattern and replace it.
  data1Query <- sub("SITE", as.character(site1), data1Query)

  # Store the result in data1.
  data1 = dbGetQuery(DB, data1Query)

  #
  # Data: site 2
  #

  data2Query <- sub("SITE", as.character(site2), data2Query)

  # Store the result in data.
  data2 = dbGetQuery(DB, data2Query)

  #
  # Data: site 3
  #

  data3Query <- sub("SITE", as.character(site3), data3Query)

  # Store the result in data.
  data3 = dbGetQuery(DB, data3Query)

  #
  # Data: site 4
  #

  data4Query <- sub("SITE", as.character(site4), data4Query)

  # Store the result in data.
  data4 = dbGetQuery(DB, data4Query)

然后合并所有数据,

      # Merge data sets.
      set.seed(1)
      dataList = list(data1, data2, data3, data4)
      allData = Reduce(function(...) merge(..., all=T), dataList)

然后绘制数据,

           timePlot(
                allData,
                pollutant = c(species, condition), 
                avg.time = mean,
                lwd = 2,
                lty = 1,
                type = "site",
                group = TRUE,
                auto.text = FALSE
            )

3 个答案:

答案 0 :(得分:2)

在循环中添加对[i]的调用,就像这样......

node: symbol lookup error:
/root/nodemodule/example/build/Release/kaku.node: 
undefined symbol: _ZN8RCSwitchC1Ev

这样,每次迭代都会在location [i]打印单个实例。

希望这是有道理的。

答案 1 :(得分:1)

@dsifford的解决方案在基础R中是正常的。但是,我建议在从PHP转换的早期看一下dplyr包,因为它使事情比无望的混乱更加透明{ {1}}函数(向所有激进的基础R-ers道歉)。

xapply

这本身并不容易,但如果你有额外的操作,它会让你的骑行更顺畅。

答案 2 :(得分:1)

你写的问题是“R循环:如何正确使用它?”

您建议使用此代码

for(i in 1:length(sites.df$siteKey)) {
    print(sites.df$siteCode)
}

此代码将是正确使用R循环的示例(如果您坚持使用它,即使不鼓励它)。

此代码所说的是每次传递打印出$ siteCode的“列”或完整值列表。循环重复每个站点的打印请求,因此每个过程都会得到相同的完整列表。

如上所述@dsifford将其更改为

for(i in 1:length(sites.df$siteKey)) {
    print(sites.df$siteCode[i])
}

意味着它不会打印整个列表,而是会为每次传递打印该列表中的第i个 th 值。

您添加的新代码有不同的问题,特别是您为每个网站反复重复相同的代码。您可能需要考虑编写函数来替换重复的代码,然后将函数提供给您正在使用的站点列表。这是循环可能有意义的情况(尽管可能没有)。但这是你原来问题的一个副问题。