2013-11-03 1 views
-1

Существует data.frame, я печатаю его с sapply:Почему sapply (..., function (x) print (x)) возвращает две копии своего ввода?

df <- data.frame(name=c("alice","becka","james","jeffery","john"), 
       sex=c("F","M","M","F","M"), 
       age=c(13,13,12,13,12), 
       height=c(56.5,65.3,57.3,62.5,69), 
       weight=c(84,98,83,84,99.5),stringsAsFactors = FALSE) 
sapply(df,function(x){print(x)}) 

[1] "alice" "becka" "james" "jeffery" "john"  
[1] "F" "M" "M" "F" "M" 
[1] 13 13 12 13 12 
[1] 56.5 65.3 57.3 62.5 69.0 
[1] 84.0 98.0 83.0 84.0 99.5 
     name  sex age height weight 
[1,] "alice" "F" "13" "56.5" "84"  
[2,] "becka" "M" "13" "65.3" "98"  
[3,] "james" "M" "12" "57.3" "83"  
[4,] "jeffery" "F" "13" "62.5" "84"  
[5,] "john" "M" "12" "69" "99.5" 

Почему выход не выглядит следующим образом:

[1] "alice" "becka" "james" "jeffery" "john"  
[1] "F" "M" "M" "F" "M" 
[1] 13 13 12 13 12 
[1] 56.5 65.3 57.3 62.5 69.0 
[1] 84.0 98.0 83.0 84.0 99.5 

Почему существует data.frame в конце, как часть весь выход?

 name  sex age height weight 
[1,] "alice" "F" "13" "56.5" "84"  
[2,] "becka" "M" "13" "65.3" "98"  
[3,] "james" "M" "12" "57.3" "83"  
[4,] "jeffery" "F" "13" "62.5" "84"  
[5,] "john" "M" "12" "69" "99.5" 
+0

Просьба представить [воспроизводимый пример] (http://stackoverflow.com/questions/5963269/how-to- Make-A-пра-р-воспроизводимый-пример). И не публикуйте скриншоты. Особенно, если они недоступны. – zero323

+2

Ничего себе, этот вопрос сейчас не похож на то, что ответил Двин и Ананда ... Кроме того, я не вижу упоминания о «уровнях» в вопросе, но он находится в названии. – Frank

ответ

3

print возвращает значение, и sapply преобразует свой результат в matrix, если это возможно. В этом случае он напечатал все, что вы просили, до , а затем вернул свое значение, матрицу символов. Используйте invisible, чтобы скрыть второй шаг:

> invisible(sapply(df,function(x){print(x)})) 
[1] "alice" "becka" "james" "jeffery" "john" 
[1] "F" "M" "M" "F" "M" 
[1] 13 13 12 13 12 
[1] 56.5 65.3 57.3 62.5 69.0 
[1] 84.0 98.0 83.0 84.0 99.5 

желательные "надежные или официальные источники" Ор можно найти, например:

> a <- print('bah') 
> a 
[1] "bah" 

EDIT: возгласы. В документации по адресу явно сказано, что он возвращает свой аргумент. (Спасибо, @joran.) Я бы все еще ожидал, что раздел «Значение» будет упоминать его снова, хотя ...

+1

Самое первое предложение в '? Print' -« print выводит его аргумент и возвращает его невидимо ». – joran

+0

@joran Спасибо; изм. Я предпочел бы, чтобы избыточный раздел «Значение» обновил его, так как я не способен читать из верхней части документа, который, как я знаю, имеет/должен иметь раздел только для информации, которую я хочу. :) – Frank

+1

Я действительно согласен. Вероятно, некоторые люди думают, что функции, главная цель которых - их побочный эффект, не нуждаются в разделе Value, но я бы предпочел иметь один, даже если все, что он говорит, «возвращает NULL невидимо» или что-то в этом роде. – joran

0

Возможно, вы должны использовать skip = 13, чтобы игнорировать заголовки. Или используйте «Китай» в качестве стартовой линии. После этого вы сможете разобрать заменяющий набор имен столбцов, вставив строку 9 в строку 10 (или используйте month.abb). Это позволит вам избежать осложнений чтения столбцов в качестве факторов.

x<- read.fwf(textConnection(ll[13:i2]), widths = c(20,-1,rep(c(7,-1),13))) 

> str(x) 
'data.frame': 39 obs. of 14 variables: 
$ V1 : Factor w/ 39 levels "All Other   ",..: 8 19 6 4 26 36 35 3 39 21 ... 
$ V2 : num 1268 1149 300 253 246 ... 
$ V3 : num 1279 1135 288 256 258 ... 
$ V4 : num 1276 1083 286 254 257 ... 
Смежные вопросы