AMcoder - javascript, python, java, html, php, sql

Սեղմեք ելքը attr() ֆունկցիայի արդյունքում

data.frame-ի սկզբնաղբյուրում կոդի վերջին երեք տողերը սահմանում են ատրիբուտները և վերադարձնում արդյունքը:

    ...
    attr(value, "row.names") <- row.names
    attr(value, "class") <- "data.frame"
    value
}

Իմ գրած գործառույթում արդյունքը անվանված ցուցակ է, որը ստեղծվել է lapply-ի կողմից: Նախքան ֆունկցիայի մարմնում որևէ հատկանիշ դնելը, արդյունքը հետևյալն է.

> x <- data.frame(a = 1:5, b = letters[1:5])    
> (g <- grep.dataframe("a|c", x))
# ...    
# $b
#   value row
# 1     a   1
# 2     c   3
> attributes(g)  # I want "list" in here...
# $names
# [1] "a" "b"

Ես կցանկանայի, որ «դասը» ներառվեր ատրիբուտների ցանկում, ուստի ավելացնում եմ attr(res, "class") <- "list" (res վերջնական արդյունքն է) res-ից ​​անմիջապես առաջ: «class»-ն այժմ հայտնվում է ատրիբուտների ցանկում: Այնուամենայնիվ, այն նաև տպվում է ֆունկցիայի արդյունքով, որը ես չեմ ուզում: Փորձեցի փաթաթել invisible-ով, բայց չստացվեց:

Ինչու՞ են ձեռքով նշանակված ատրիբուտները տպագրվում ֆունկցիայի արդյունքով, բայց փակվում են իմ ստեղծած տվյալների նոր շրջանակում:

> (h <- grep.dataframe("a|c", x))
# ...    
# $b
#   value row
# 1     a   1
# 2     c   3

# attr(,"class")  # ...This prints with the result. I don't want that.
# [1] "list"
> attributes(h)   # ...But I want these attributes
# $names
# [1] "a" "b"

# $class
# [1] "list"
27.05.2014

  • Դուք պետք է ավելացնեք / փոփոխեք տպման մեթոդը ձեր դասի համար: Օրինակ՝ ուսումնասիրեք print.data.frameի կոդը 27.05.2014
  • Կարևոր է, որ ձեր data.frame-ը կորցնի data.frame հատկանիշը: Հակառակ դեպքում պարզապես օգտագործեք attr(res, "class") <- c("list", "data.frame"): 27.05.2014
  • @shadow, այն մտնում է որպես data.frame, բայց listը վերադարձվում է: Դա տվյալների շրջանակների ցանկ է, եթե դա կարևոր է: Սակայն արդյունքների ցանկի առանձին տարրերն իրենք են տվյալների շրջանակներ: 27.05.2014
  • Չեմ կարծում, որ այն փաստը, որ ձեր ցուցակը ստեղծվել է lapply-ի կողմից: Փորձեք res <- list(1); attr(res, "class") <- "list"; res 27.05.2014
  • Հետաքրքրությունից դրդված՝ ինչո՞ւ է ձեզ բացարձակապես անհրաժեշտ դասի հատկանիշ, երբ, ըստ երևույթին, ցուցակները լռելյայն չունեն: 27.05.2014

Պատասխանները:


1

?class փաստաթուղթն առաջարկում է որոշ ցուցումներ.

Շատ R օբյեկտներ ունեն դասի հատկանիշ՝ նիշերի վեկտոր, որը տալիս է այն դասերի անունները, որոնցից օբյեկտը ժառանգում է։ Եթե ​​օբյեկտը չունի դասի հատկանիշ, այն ունի ներածական դաս, մատրիցա, զանգված կամ ռեժիմ(x) արդյունք (բացառությամբ, որ ամբողջ թվերի վեկտորներն ունեն իմպլիցիտ դասի ամբողջ թիվ): (oldClass և oldClass գործառույթներ՝ ստացեք և սահմանեք հատկանիշը, որը կարող է կատարվել նաև ուղղակիորեն:)

Երբ ընդհանուր fun ֆունկցիան կիրառվում է c(first, second) դասի հատկանիշ ունեցող օբյեկտի վրա, համակարգը որոնում է fun.first կոչվող ֆունկցիան և, եթե գտնում է, կիրառում է օբյեկտի վրա: Եթե ​​նման գործառույթ չգտնվի, փորձարկվում է fun.second կոչվող ֆունկցիան: Եթե ​​ոչ մի դասի անուն չի արտադրում համապատասխան ֆունկցիա, ապա օգտագործվում է fun.default ֆունկցիան (եթե այն գոյություն ունի): Եթե ​​դասի հատկանիշ չկա, փորձարկվում է ենթադրյալ դասը, ապա լռելյայն մեթոդը:

Դրանից և մի քանի պարզ թեստերից ես հավաքում եմ, որ.

  • ցանկը այս ներածական դասերից մեկն է. տես attributes(list(1)), typeof(list(1))
  • երբ print-ը կանչվում է ցուցակում, այն օգտագործում է print.default
  • print.default տպում է օբյեկտի ատրիբուտները

Այսպիսով, դուք կարող եք սահմանել print.list, որը կկարգավորի ձեր հատուկ դեպքը.

 print.list <- function(x, ...) {
    if (is.list(x)) attr(x, "class") <- NULL
    print.default(x, ...)
 }

res <- list(1)
attr(res, "class") <- "list"
res
# [[1]]
# [1] 1

attributes(res)
# $class
# [1] "list"
27.05.2014
  • Շնորհակալություն։ Ես դա կտամ: Թեև ճիշտ է, որ անանուն ցուցակը չունի ատրիբուտներ, այն անվանակոչված ցուցակը, ինչպիսին ես եմ օգտագործում, ունի անունների հատկանիշ: Ինձ մի փոքր շփոթեցնող է թվում, թե ինչու տվյալների շրջանակն իր ատրիբուտների ցանկում կունենա դասի հատկանիշ, բայց ոչ ցուցակ: 27.05.2014
  • @RichardScriven Քանի որ տվյալների շրջանակները ցուցակի հատուկ տեսակ են՝ data.frame դասի հետ: Այսպիսով, նրանք ունեն դաս, բայց ոչ բոլոր ցուցակներն ունեն: Կոնկրետ ի՞նչն է դրանում շփոթեցնող: 27.05.2014
  • @Dason, Միգուցե շփոթեցնողը սխալ բառ էր: Ես ենթադրում եմ, որ ուղղակի զարմացած եմ, հաշվի առնելով, որ մյուս կառույցներն ունեն դասակարգային հատկանիշներ 27.05.2014
  • Ես գրում եմ իմ առաջին փաթեթը, ուստի դեռ սովորում եմ մեթոդների, ատրիբուտների, փաստարկների և այլնի մասին: Հնարավոր է, որ դեռ մի քանի հաղորդագրություններ լինեն, մինչև ավարտեմ: :) 27.05.2014
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..