2017-10-18 44 views
1

La sortie R vers la console est contrôlée par l'option "max.print" et les objets volumineux sont tronqués à ce nombre, les entrées en trop étant omises. La documentation pour ?options états:Comment l'option R "max.print" est-elle quantifiée?

max.print:

entier

, par défaut 99999. impression ou méthodes montrent peut utiliser cette option, de limiter la quantité d'informations qui est imprimé, à quelque chose l'ordre de (et typiquement légèrement moins que) max.printentrées.

Mais je ne peux pas trouver une définition exacte de "entrées". Il n'est pas mesuré en caractères, mais semble contrôler:

  1. vecteur ou éléments liste
  2. lignes de trame de données ou matrice
  3. lignes de texte à partir des sorties de fonction

Cela rend quelque peu imprévisible lorsque l'option essayer de planifier les tailles de sortie (par exemple, lorsque sink est sortie de la console dans un fichier). Pour exercer plus de contrôle, il serait utile de savoir ce que constituent "entrées" pour un appel donné print. Vraisemblablement, ceci est défini à partir de la structure de données passée à print ... existe-t-il une définition de ce qui constitue une "entrée" pour toutes les structures de données?

+1

Serait-il possible d'utiliser 'write()' au lieu de 'sink '? L'impression _man page_ indique '' Pour une impression plus personnalisable (mais encombrante), voyez 'cat',' format' ou aussi 'write'. '' ('? Print') –

+0

Malheureusement, non - j'essaie spécifiquement de canaliser la sortie d'une commande directement vers un fichier, et 'sink()' est, à ma connaissance, le seul moyen de le faire. Si je travaillais avec des vecteurs de caractères, 'write()' conviendrait, mais je ne peux pas forcer ma sortie dans un vecteur de caractères sans endommager dramatiquement sa lisibilité. –

+0

Peut-être que cela vaut la peine d'aller dans votre processus en amont et de poser une nouvelle question sur la façon de produire les données que vous avez. –

Répondre

0

Semble être la limite du nombre de caractères, numériques ou logiques, c'est-à-dire length() d'un objet.

options(max.print = 10) #Set max.print to 10 

test<-1:100 #test1 
test 
test2<-101:200 #test2 
test2 
letters #test3 
test4<-c("test1","test2","test3","test4","test5","test6","test7","test8","test9","test10","test11,"test12","test13") #test4 
test4 
data.frame(cbind(test,test2)) #test5 
test==test2 #Test6 
+0

Vous avez une faute de frappe dans 'test4' - la chaîne" test11 "a besoin de guillemets fermants. En tout cas, cela semble être vrai pour les vecteurs. Pour les matrices et les dataframes, avec 'options (" max.print "= maxn") ', le retour semble être tronqué par' floor (maxn/ncol (df)) ', et' ncol (df) == length (df Je suppose que c'est parce qu'une ligne partielle ne peut pas être retournée –

+0

En outre, voici une exception: 'options (" max.print "= 10)' 'stringvector2 = c (" R "," bonjour "," world "," foo "," bar "," mon "," hovercraft "," est "," complet "," de "," anguilles ")' a la longueur 11, mais 'stringvector2' renvoie' [1] " R "" bonjour "" monde "" foo "" bar "" mon "" hovercraft "" est "" plein "" de "" anguilles "' c'est-à-dire, il retourne tous les 11 éléments! –

+0

J'ai remarqué quand vous fournissez 11 caractères retourne tous 11. Pas sûr pourquoi – CCurtis

1

essai et connaissances,

options(max.print = 20) 

(forty <- 1:40) 
#> [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 
#> [19] 19 20 
#> [ reached getOption("max.print") -- omitted 20 entries ] 

(A = matrix(forty, nrow=10, ncol=4, byrow = TRUE)) 
#>  [,1] [,2] [,3] [,4] 
#> [1,] 1 2 3 4 
#> [2,] 5 6 7 8 
#> [3,] 9 10 11 12 
#> [4,] 13 14 15 16 
#> [5,] 17 18 19 20 
#> [ reached getOption("max.print") -- omitted 5 rows ] 

as.data.frame(A) 
#> V1 V2 V3 V4 
#> 1 1 2 3 4 
#> 2 5 6 7 8 
#> 3 9 10 11 12 
#> 4 13 14 15 16 
#> 5 17 18 19 20 
#> [ reached getOption("max.print") -- omitted 5 rows ] 

require(tibble) 
as_tibble(A) 
#> # A tibble: 10 x 4 
#>  V1 V2 V3 V4 
#> <int> <int> <int> <int> 
#> 1  1  2  3  4 
#> 2  5  6  7  8 
#> 3  9 10 11 12 
#> 4  13 14 15 16 
#> [ reached getOption("max.print") -- omitted 6 rows ] 

Comme Keegan Smith points out below le flou peut être illustré clairement comme celui-ci

options(max.print = 5); c(1:10); c(1:6) 
#> [1] 1 2 3 4 5 
#> [ reached getOption("max.print") -- omitted 5 entries ] 
#> [1] 1 2 3 4 5 6 

à savoir max.print est floue dans la limite. Par souci de curiosité, j'ai récupéré le code source pour max.print

+0

Bien sûr, mais R est un langage de programmation, donc il doit y avoir une règle définissant cette La détermination de tout par l'essai est fastidieuse et crée des erreurs inductives potentielles lorsqu'un comportement inattendu survient - par exemple, x.print "= 20); c (1:40) 'renvoie 20 éléments, mais' c (1:21) 'renvoie 21 éléments. –

+0

D'accord; le comportement est défini de façon incertaine quelque part. J'ai simplement adopté une approche pragmatique. –

+0

Assez juste; une autre approche pragmatique à ce problème serait de définir 'options (" max.print "=. Machine $ integer.max)' (bien, pragmatique dans ce cas, puisque je sais que ma sortie ne sera pas assez grande pour causer des problèmes) . Je n'ai aucun problème avec les solutions de contournement, je voudrais juste savoir comment cela fonctionne sous le capot! –

2

Je crois que cette partie est écrite en Fortran. C'est tout grec à moi mais c'est le courage littéral de celui-ci.

else if (streql(CHAR(namei), "max.print")) { 
    int k = asInteger(argi); 
    if (k < 1) error(_("invalid value for '%s'"), CHAR(namei)); 
    SET_VECTOR_ELT(value, i, SetOption(tag, ScalarInteger(k))); 
    } 

Si vous souhaitez regarder le code source complet pour options il peut être trouvé ici. https://github.com/wch/r-source/blob/trunk/src/main/options.c

+1

Bon appel en retournant à la source. C'est l'un des membres de la famille 'C' - aussi grecque pour moi (si c'était Fortran, j'aurais une chance). J'adore les commentaires, cependant; ligne 427: '[Vomits tranquillement sur les chaussures ...] '. –

+1

Compte tenu de ma mauvaise compréhension de 'C', voici mon interprétation: Avant line1 ici, il y a un' if' à propos des arguments de 'options' dans le format" list "ou" paired ". Étant donné que l'argument n'est pas au format list (d'où 'else'), il doit être une paire d'arguments:' namei' = "max.print", 'argi' = le nombre que nous avons spécifié dans' options'. Donc, pour grossièrement analyser C en anglais: "si l'argument' namei' se transforme en une chaîne de caractères correspondant à "max.print" (en d'autres termes, "si c'est un appel à max.print"), alors définissez la variable entière ' k' égal à "argi". 'k' ne peut pas être inférieur à 1 - si oui, donnez une erreur - alors' SET_VECTOR_ELT ... ' –

+1

' SET_VECTOR_ELT' semble être une fonction définie en interne, peut-être tirée de l'un des En supposant qu'il soit utilisé pour définir un vecteur, il semble dire "appelez la fonction' SetOption' pour 'tag' (ce que je suppose correspondre à" max.print "en quelque sorte), et réglez vector 'value' pour l'itération' i' à la valeur entière de 'k'. _Si c'est true_ (connaissez quelqu'un qui code dans 'C'?) Alors l'appel" max.print "définit la taille du vecteur qui peut être imprimé sur la console. Cependant, cela n'explique pas tout le comportement étrange que nous avons vu ... –