2014-11-21 1 views
6

Возможно, я пропустил что-то очень простое.Как незримо вернуть часть списка

Как создать определенную пользователем функцию в R, которая возвращает список, в котором некоторые элементы невидимы?

sky <- function(){ 
list(sun = 1, clouds = 4, birds =2, moon = 0) 
} 

up <- sky() 

up 
#$sun 
#[1] 1 
# 
#$clouds 
#[1] 4 
# 
#$birds 
#[1] 2 
# 
#$moon 
#[1] 0 

Я хотел бы up печатать up$sun и up$clouds, но не двух других элементов. Тем не менее, я все еще хочу up быть список всех четырех элементов:

names(up) 
#[1] "sun" "clouds" "birds" "moon" 
+0

Вы просите «вызов» на «вверх», что означает, что это функция, но затем вы просите отображать имена, как если бы это был объект данных. –

+0

Хорошая точка. Я только что исправил это. – sdg238

+0

Что означает элемент, невидимый? Что «вернет $ bird»? – hadley

ответ

5

Вы могли бы сделать метод печати S3

sky <- function(){ 
    structure(list(sun = 1, clouds = 4, birds =2, moon = 0), class="mysky") 
} 
print.mysky <- function(x, ...) print(x[1:2]) 

sky() 
#$sun 
#[1] 1 
# 
#$clouds 
#[1] 4 

Вы можете видеть, что это влияет только он напечатан

str(sky()) 
#List of 4 
# $ sun : num 1 
# $ clouds: num 4 
# $ birds : num 2 
# $ moon : num 0 
# - attr(*, "class")= chr "mysky" 

names(sky()) 
#[1] "sun" "clouds" "birds" "moon" 

Вот еще один способ присвоить класс объекта

sky <- function(){ 
    out <- list(sun = 1, clouds = 4, birds =2, moon = 0) 
    class(out) <- "mysky" 
    out 
} 

print.mysky будет послан, так как класс объекта является «MySky»

class(sky()) 
#[1] "mysky" 

если вы хотите послать метод печати по умолчанию можно либо вызвать его непосредственно (print.default(sky())), или unclass объект

#print.default(sky()) 
unclass(sky()) 

#$sun 
#[1] 1 
# 
#$clouds 
#[1] 4 
# 
#$birds 
#[1] 2 
# 
#$moon 
#[1] 0 
-1

Почему бы вам не сделать это с помощью JQuery. Поместите элементы в <li> и используйте JQuery, чтобы скрыть и показать элементы. Вы можете показать первые две или показать все остальное. Я надеюсь, что этот механизм будет работать для вас.

<ul class="collapse"> 
    <li>sun</li> 
    <li>clouds</li> 
    <li>birds</li> 
    <li>moon</li> 
</ul> 

JS

$(document).ready(function() { 
    $('ul.collapse').wrap('<div class="collapseWrapper" />'); 
    $('div.collapseWrapper').css({ 'height' : '45px' }).after('<a href="#" class="collapseMore">view details . . .</a>'); 

    $('a.collapseMore').click(function() { 
      if ($(this).hasClass('expanded')) { 
       $(this).prev().animate({ height: '45px' }, 500); 
       $(this).text('view details . . .').removeClass('expanded'); 
      } 
      else { 
       $(this).prev().animate({ height: $(this).prev().find('ul.collapse').outerHeight(true) }, 500); 
       $(this).text('hide details . . .').addClass('expanded'); 
      } 
      return false; 
    }); 
}); 

СМЧ:

ul.collapse{ } 
ul.collapse li { } 
div.collapseWrapper { overflow: hidden; } 
a.collapseMore { } 
a.collapseMore:hover { } 
+2

Этот код R? – sdg238

1

Это использует print, чтобы сделать работу. Он имеет преимущество над cat, что «понимает» списки:

sky <- function(){ 
    x <- list(sun = 1, clouds = 4, birds =2, moon = 0) 
    print(x[1:2]) 
    invisible(x) 
} 
#----------- 
> up <- sky() 
$sun 
[1] 1 

$clouds 
[1] 4 

> z <- sky() 
$sun 
[1] 1 

$clouds 
[1] 4 

> print(z) 
$sun 
[1] 1 

$clouds 
[1] 4 

$birds 
[1] 2 

$moon 
[1] 0 

Часто используется cat если цель поставить что-то карапуз Hte консоль, которая не является значением

sky <- function(){ 
x <- list(sun = 1, clouds = 4, birds =2, moon = 0) 
sapply(x[1:2], cat, "\n") 
invisible(x) 
} 

up <- sky() 
1 
4 
Смежные вопросы