2013-04-19 2 views
0

..йся моя проблема по данным:Векторизованной функция не дает желаемый результат

rm(list=ls()) 

clc06_1 <- "111 - Continuous urban fabric" 
clc06_2 <- "112 - Discontinuous urban fabric" 
clc06_3 <- "121 - Industrial or commercial units" 
clc06_4 <- "122 - Road and rail networks and associated land" 
clc06_5 <- "123 - Port areas" 
clc06_6 <- "124 - Airports" 
clc06_7 <- "131 - Mineral extraction sites" 
clc06_8 <- "132 - Dump sites" 
clc06_9 <- "133 - Construction sites" 
clc06_10 <- "141 - Green urban areas" 
clc06_11 <- "142 - Sport and leisure facilities" 
clc06_12 <- "211 - Non-irrigated arable land" 
clc06_13 <- "212 - Permanently irrigated land" 
clc06_14 <- "213 - Rice fields" 
clc06_15 <- "221 - Vineyards" 
clc06_16 <- "222 - Fruit trees and berry plantations" 
clc06_17 <- "223 - Olive groves" 
clc06_18 <- "231 - Pastures" 
clc06_19 <- "241 - Annual crops associated with permanent crops" 
clc06_20 <- "242 - Complex cultivation patterns" 
clc06_21 <- "243 - Land principally occupied by agriculture, with significant areas of natural vegetation" 
clc06_22 <- "244 - Agro-forestry areas" 
clc06_23 <- "311 - Broad-leaved forest" 
clc06_24 <- "312 - Coniferous forest" 
clc06_25 <- "313 - Mixed forest" 
clc06_26 <- "321 - Natural grasslands" 
clc06_27 <- "322 - Moors and heathland" 
clc06_28 <- "323 - Sclerophyllous vegetation" 
clc06_29 <- "324 - Transitional woodland-shrub" 
clc06_30 <- "331 - Beaches, dunes, sands" 
clc06_31 <- "332 - Bare rocks" 
clc06_32 <- "333 - Sparsely vegetated areas" 
clc06_33 <- "334 - Burnt areas" 
clc06_34 <- "335 - Glaciers and perpetual snow" 
clc06_35 <- "411 - Inland marshes" 
clc06_36 <- "412 - Peat bogs" 
clc06_37 <- "421 - Salt marshes" 
clc06_38 <- "422 - Salines" 
clc06_39 <- "423 - Intertidal flats" 
clc06_40 <- "511 - Water courses" 
clc06_41 <- "512 - Water bodies" 
clc06_42 <- "521 - Coastal lagoons" 
clc06_43 <- "522 - Estuaries" 
clc06_44 <- "523 - Sea and ocean" 

# I want to extract the CLC Code nrs which are the 3-digit number in the string: 
foo <- function(x) unlist(strsplit(x, " - "))[[1]] 

# and vectorize foo. But why is.. 
sapply(ls()[1:44], foo, simplify = T) 

# not behaving like.. 
foo(clc06_9) 

ответ

3

Следующие должны работать для вас:

sapply(ls()[1:44], function(x) foo(get(x)), simplify = TRUE) 

Вы можете сравнить поведение со следующим:

> ls()[1] 
[1] "clc06_1" 
> foo(ls()[1]) 
[1] "clc06_1" 
> foo(get(ls()[1])) 
[1] "111" 

, что уже объяснено в ответе Джубы.


Показав, что почему вы не используете list?

Сравнить:

mylist <- list(clc06_1 = "111 - Continuous urban fabric", 
       clc06_2 = "112 - Discontinuous urban fabric", 
       clc06_3 = "121 - Industrial or commercial units", 
       clc06_4 = "122 - Road and rail networks and associated land", 
       clc06_5 = "123 - Port areas", 
       clc06_6 = "124 - Airports") 
sapply(mylist, foo) 
# clc06_1 clc06_2 clc06_3 clc06_4 clc06_5 clc06_6 
# "111" "112" "121" "122" "123" "124" 
+0

+1 за время подачи примеров :) – juba

+0

get() был тем, что я искал! Однако включение имен в список, по-видимому, является наиболее прямым подходом. +1 и спасибо вам обоим! – Kay

3

ls() возвращает имена объектов, а не сами объекты. Так что вы должны сделать что-то вроде:

R> vars <- grep("^clc06_", ls(), value=TRUE) 
R> sapply(vars, function(v) { foo(get(v)) }, simplify = T) 
clc06_1 clc06_10 clc06_11 clc06_12 clc06_13 clc06_14 clc06_15 clc06_16 
    "111" "141" "142" "211" "212" "213" "221" "222" 
clc06_17 clc06_18 clc06_19 clc06_2 clc06_20 clc06_21 clc06_22 clc06_23 
    "223" "231" "241" "112" "242" "243" "244" "311" 
clc06_24 clc06_25 clc06_26 clc06_27 clc06_28 clc06_29 clc06_3 clc06_30 
    "312" "313" "321" "322" "323" "324" "121" "331" 
clc06_31 clc06_32 clc06_33 clc06_34 clc06_35 clc06_36 clc06_37 clc06_38 
    "332" "333" "334" "335" "411" "412" "421" "422" 
clc06_39 clc06_4 clc06_40 clc06_41 clc06_42 clc06_43 clc06_44 clc06_5 
    "423" "122" "511" "512" "521" "522" "523" "123" 
clc06_6 clc06_7 clc06_8 clc06_9 
    "124" "131" "132" "133" 

ls() Но используя для выбора переменных не является хорошей идеей. Вы действительно должны хранить все свои значения clc06_ в векторе.

+0

+1 за то, что нашли время, чтобы объяснить, почему :) – A5C1D2H2I1M1N2O1R2T1

Смежные вопросы