Завершение чанка Lyx/knitr в ячейках таблицы

Я использую Lyx 2.1.2 и Knitr (не знаю, как определить версию) на Fedora 20. Я столкнулся с проблемой завершения фрагментов Knitr, когда фрагмент встроен в ячейку таблицы. Если я не ввожу последнюю строку @ для чанка, я получаю сообщение об ошибке, и документ не может быть создан. Если я ввожу последнюю строку @ для чанка, это работает, но метка @ появляется буквально в ячейке таблицы после вывода из R-кода.

Я подозреваю, что это часть общей проблемы, о которой я упоминал в другой публикации, связанной с объектами LaTex, непосредственно следующими за фрагментом Knitr.

Это пример документа Lyx, демонстрирующий проблему:

\lyxformat 474
\begin_document
\begin_header
\textclass article
\use_default_options true
\begin_modules
knitr
\end_modules
\maintain_unincluded_children false
\language english
\language_package default
\inputencoding auto
\fontencoding global
\font_roman default
\font_sans default
\font_typewriter default
\font_math auto
\font_default_family default
\use_non_tex_fonts false
\font_sc false
\font_osf false
\font_sf_scale 100
\font_tt_scale 100
\graphics default
\default_output_format default
\output_sync 0
\bibtex_command default
\index_command default
\paperfontsize default
\spacing single
\use_hyperref false
\papersize default
\use_geometry false
\use_package amsmath 1
\use_package amssymb 1
\use_package cancel 1
\use_package esint 1
\use_package mathdots 1
\use_package mathtools 1
\use_package mhchem 1
\use_package stackrel 1
\use_package stmaryrd 1
\use_package undertilde 1
\cite_engine basic
\cite_engine_type default
\biblio_style plain
\use_bibtopic false
\use_indices false
\paperorientation portrait
\suppress_date false
\justification true
\use_refstyle 1
\index Index
\shortcut idx
\color #008000
\end_index
\secnumdepth 3
\tocdepth 3
\paragraph_separation indent
\paragraph_indentation default
\quotes_language english
\papercolumns 1
\papersides 1
\paperpagestyle default
\tracking_changes false
\output_changes false
\html_math_output 0
\html_css_as_file 0
\html_be_strict false
\end_header

\begin_body

\begin_layout Standard
This is an example of a problem that arises when knitr chunks are embedded
 in Lyx table cells.
 Here is the table:
\end_layout

\begin_layout Standard
\begin_inset Tabular
<lyxtabular version="3" rows="2" columns="2">
<features rotate="0" tabularvalignment="middle">
<column alignment="center" valignment="top">
<column alignment="center" valignment="top">
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Text
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Chunk
\end_layout

\end_inset
</cell>
</row>
<row>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
Arbitrary Text
\end_layout

\end_inset
</cell>
<cell alignment="center" valignment="top" topline="true" bottomline="true" leftline="true" rightline="true" usebox="none">
\begin_inset Text

\begin_layout Plain Layout
\begin_inset Flex Chunk
status open

\begin_layout Plain Layout

<<example,echo=FALSE>>=
\end_layout

\begin_layout Plain Layout

print("Hello World")
\end_layout

\begin_layout Plain Layout

@
\end_layout

\end_inset


\end_layout

\end_inset
</cell>
</row>
</lyxtabular>

\end_inset


\end_layout

\end_body
\end_document

Это вывод Tex из pdflatex:

\batchmode
\makeatletter
\def\input@path{{/home/loga/bugs/cell-chunk//}}
\makeatother
\documentclass[english]{article}\usepackage[]{graphicx}\usepackage[]{color}
%% maxwidth is the original width if it is less than linewidth
%% otherwise use linewidth (to make sure the graphics do not exceed the margin)
\makeatletter
\def\maxwidth{ %
  \ifdim\Gin@nat@width>\linewidth
    \linewidth
  \else
    \Gin@nat@width
  \fi
}
\makeatother

\definecolor{fgcolor}{rgb}{0.345, 0.345, 0.345}
\newcommand{\hlnum}[1]{\textcolor[rgb]{0.686,0.059,0.569}{#1}}%
\newcommand{\hlstr}[1]{\textcolor[rgb]{0.192,0.494,0.8}{#1}}%
\newcommand{\hlcom}[1]{\textcolor[rgb]{0.678,0.584,0.686}{\textit{#1}}}%
\newcommand{\hlopt}[1]{\textcolor[rgb]{0,0,0}{#1}}%
\newcommand{\hlstd}[1]{\textcolor[rgb]{0.345,0.345,0.345}{#1}}%
\newcommand{\hlkwa}[1]{\textcolor[rgb]{0.161,0.373,0.58}{\textbf{#1}}}%
\newcommand{\hlkwb}[1]{\textcolor[rgb]{0.69,0.353,0.396}{#1}}%
\newcommand{\hlkwc}[1]{\textcolor[rgb]{0.333,0.667,0.333}{#1}}%
\newcommand{\hlkwd}[1]{\textcolor[rgb]{0.737,0.353,0.396}{\textbf{#1}}}%

\usepackage{framed}
\makeatletter
\newenvironment{kframe}{%
 \def\at@end@of@kframe{}%
 \ifinner\ifhmode%
  \def\at@end@of@kframe{\end{minipage}}%
  \begin{minipage}{\columnwidth}%
 \fi\fi%
 \def\FrameCommand##1{\hskip\@totalleftmargin \hskip-\fboxsep
 \colorbox{shadecolor}{##1}\hskip-\fboxsep
     % There is no \\@totalrightmargin, so:
     \hskip-\linewidth \hskip-\@totalleftmargin \hskip\columnwidth}%
 \MakeFramed {\advance\hsize-\width
   \@totalleftmargin\z@ \linewidth\hsize
   \@setminipage}}%
 {\par\unskip\endMakeFramed%
 \at@end@of@kframe}
\makeatother

\definecolor{shadecolor}{rgb}{.97, .97, .97}
\definecolor{messagecolor}{rgb}{0, 0, 0}
\definecolor{warningcolor}{rgb}{1, 0, 1}
\definecolor{errorcolor}{rgb}{1, 0, 0}
\newenvironment{knitrout}{}{} % an empty environment to be redefined in TeX

\usepackage{alltt}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}

\makeatletter

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% LyX specific LaTeX commands.
%% Because html converters don't know tabularnewline
\providecommand{\tabularnewline}{\\}

\makeatother

\usepackage{babel}
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
\begin{document}
This is an example of a problem that arises when knitr chunks are
embedded in Lyx table cells. Here is the table:

\begin{tabular}{|c|c|}
\hline 
Text &
Chunk\tabularnewline
\hline 
\hline 
Arbitrary Text &

\begin{knitrout}
\definecolor{shadecolor}{rgb}{0.969, 0.969, 0.969}\color{fgcolor}\begin{kframe}
\begin{verbatim}
## [1] "Hello World"
\end{verbatim}
\end{kframe}
\end{knitrout}
@\tabularnewline
\hline 
\end{tabular}
\end{document}

Глядя на вывод Tex (четыре строки снизу), метка @ появляется за пределами среды Knitrout, но в файле Lyx метка @ находится внутри фрагмента и (по крайней мере, с точки зрения WYSIWYM) явно не предназначена для появления в файле. документ.

Есть ли способ обойти это или это ошибка, которую нужно исправить? Конечно, если есть какие-либо другие данные, которые я могу опубликовать, просто дайте мне знать.

Спасибо!


person user4294565    schedule 01.12.2014    source источник
comment
Хороший пост! Спасибо за предоставление MWE. Один небольшой комментарий: когда вы ссылаетесь на другой вопрос, полезно, если вы ссылаетесь на него. В этом случае вы имеете в виду stackoverflow.com/questions/27182368/ . Вы правы в своем подозрении, что это связано с этим постом.   -  person scottkosty    schedule 01.12.2014


Ответы (1)


Это связано со следующей ошибкой LyX: http://www.lyx.org/trac/ticket/8875 (будет исправлено в LyX 2.2.0)

У вас уже есть один обходной путь (добавление @). Другой обходной путь, который вы можете предпочесть, — это использовать LyX ERT (чтобы узнать больше о различиях между фрагментами ERT и LyX, см. -lyx-custom-knitr-insets">Разница между вставками для вязания ERT и LyX). Для этого удалите вставку чанка и поставьте курсор в ячейку таблицы, где она была, и нажмите "ctrl+l" (или Insert > TeX Code)

<<example,echo=FALSE>>=
print("Hello World")
@

Я не могу добавить пустые строки в код, но внутри поля ERT вверху и внизу должна быть пустая строка. Это гарантирует, что Knitr распознает фрагмент Knitr.

Обратите внимание, что экспорт в Rnw может помочь в диагностике этих проблем.

person scottkosty    schedule 01.12.2014