Для каждой строки в кадре данных R

Я могу думать о трех опциях:

Реализация RFC 2217

RFC 2217 покрывает COM-порт к стандарту TCP/IP, который позволяет клиенту в одной системе эмулировать последовательный порт к локальным программам при прозрачной отправке и получении сигналов данных и сигналов управления к серверу в другой системе, которая на самом деле имеет последовательный порт. Вот общий обзор .

то, Что Вы сделали бы, является находкой, или реализуйте клиентский драйвер COM-порта, который реализовал бы сторону клиента системы на Вашем ПК - кажущийся быть реальным последовательным портом, но в действительности доставляющий все в челноке к серверу. Вы могли бы быть в состоянии получить этот драйвер бесплатно от Digi, Lantronix, и т.д. в поддержку их реальных автономных серверов последовательного порта.

Вы тогда реализовали бы сторону сервера соединения локально в другой программе - разрешение клиенту соединиться и издание данных и команд управления по мере необходимости.

Это, вероятно, не тривиально, но RFC там, и Вы могли бы быть в состоянии найти проект с открытым исходным кодом, который реализует одну или обе стороны соединения.

поочередно Изменяют драйвер

последовательного порта Linux, источник драйвера последовательного порта для Linux легко доступен. Возьмите это, разрушьте аппаратные части управления и имейте тот один драйвер, выполненный два/dev/ttySx порта как простая обратная петля. Тогда подключите свою реальную программу к ttyS2 и свое средство моделирования к другому ttySx.

Использование два USB<-> Последовательные кабели в обратной петле

, Но самая легкая вещь сделать прямо сейчас? Потратьте 40$ на два USB-устройства последовательного порта, соедините их проводом вместе (нуль-модем) и на самом деле имейте два реальных последовательных порта - один для программы, которую Вы тестируете, один для Вашего средства моделирования.

-Adam

165
задан jogo 4 January 2016 в 09:11
поделиться

3 ответа

Вы можете попробовать это, используя apply () function

> d
  name plate value1 value2
1    A    P1      1    100
2    B    P2      2    200
3    C    P3      3    300

> f <- function(x, output) {
 wellName <- x[1]
 plateName <- x[2]
 wellID <- 1
 print(paste(wellID, x[3], x[4], sep=","))
 cat(paste(wellID, x[3], x[4], sep=","), file= output, append = T, fill = T)
}

> apply(d, 1, f, output = 'outputfile')
103
ответ дан 23 November 2019 в 21:07
поделиться

Вы можете использовать функцию by () :

by(dataFrame, 1:nrow(dataFrame), function(row) dostuff)

Но повторение строк напрямую, как это, редко бывает тем, что вам нужно; вместо этого вам следует попробовать векторизовать. Могу я спросить, что на самом деле происходит в цикле?

115
ответ дан 23 November 2019 в 21:07
поделиться

Во-первых, точка зрения Джонатана о векторизации верна. Если ваша функция getWellID () векторизована, вы можете пропустить цикл и просто использовать cat или write.csv:

write.csv(data.frame(wellid=getWellID(well$name, well$plate), 
         value1=well$value1, value2=well$value2), file=outputFile)

Если getWellID () не векторизован, то рекомендация Джонатана использовать от или knguyen's предложение применить должно работать.

В противном случае, если вы действительно хотите использовать для , вы можете сделать что-то вроде этого:

for(i in 1:nrow(dataFrame)) {
    row <- dataFrame[i,]
    # do stuff with row
}

Вы также можете попробовать использовать пакет foreach , хотя для этого вам потребуется ознакомьтесь с этим синтаксисом. Вот простой пример:

library(foreach)
d <- data.frame(x=1:10, y=rnorm(10))
s <- foreach(d=iter(d, by='row'), .combine=rbind) %dopar% d

Последний вариант - использовать функцию из пакета plyr , и в этом случае соглашение будет очень похоже на функцию apply.

library(plyr)
ddply(dataFrame, .(x), function(x) { # do stuff })
84
ответ дан 23 November 2019 в 21:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: