2016-07-19 3 views
0

Я предваряю это, сказав, что знаю, что это немного странный вопрос, но я не знаю, как еще это выразить.R- Используйте строку как выражение

У меня есть следующие строки в частности R сценария:

hist(sce$total_counts/1e6, xlab="Library sizes (millions)", main="", 
breaks=20, col="grey80", ylab="Number of cells"); 

Для этого бита:

sce$total_counts/1e6 

1e6 часть должна быть пользовательский ввод, и я пытаюсь настроить его так, что первая часть и пользовательская часть получают «конкатенированные», а затем оцениваются. Проблема заключается в использовании пасты, а другие вещи возвращают строки, и мне не нужны строки. Я хочу, чтобы иметь возможность заменить часть «/ 1e6» на «/ 1e3», например, и ничего не менять в этой строке кода и все еще работать. Я попытался сделать следующее:

object <- paste("sce$total_counts", args[1], sep="") 
ob <- parse(text=object) # expression(sce$total_counts/1e6) 
hist(ob, xlab="Library sizes (millions)", main="", 
breaks=20, col="grey80", ylab="Number of cells"); 

Но он вернулся эту ошибку:

Error in hist.default(ob, xlab = "Library sizes (millions)", main = "", : 
    'x' must be numeric 

Я не знаю, как еще это слово, кроме как сказать: Как вам псевдоним одной части код как что-то еще? Я хочу ob с пользовательским вводом «/ 1E6» означает тот же самое, как sce$total_counts/1e6

+1

Нет необходимости в этом вскрытии и т. Д. Просто выполните 'x <- 1: 100; val <- 1e6; hist (x/val) '- вы можете изменить' val' на любой знаменатель, который вы хотите. – thelatemail

+0

Попробуйте 'eval (parse (text = object))' –

+1

@DominicComtois - Чтобы процитировать 'fortunes :: fortune (106)' "* Если ответ является parse(), вы должны, как правило, переосмыслить вопрос. *" – thelatemail

ответ

2

Если идея состоит в том, что вы хотите выполнить aribitrary преобразования по первому аргументу hist перед выполнением гистограммы затем передать функцию, которая делает то преобразование

myhist <- function(f, ...) { 
    f <- match.fun(f) 
    x <- 1:20 
    hist(f(x, ...)) 
} 

# test runs 
myhist("/", 1e6) 
myhist(function(x) x/1e3) 
f <- function(x) x/100; myhist(f) 
myhist(sqrt) 

Также можно было бы передать функцию в форме формуляра следующим образом. См. ?fn:

library(gsubfn) 
fn$myhist(~ x/1e6) 
fn$myhist(~ sqrt(x)) 
+0

Здесь может быть проблема с безопасностью. Что делать, если пользователь переходит в какую-то злую функцию? – dash2

+0

Согласовано, и если пользователь является программистом в CLI, это нормально, но это может быть не так, если пользователь, например. кто-то на другом конце блестящего веб-приложения. – dash2

+0

Кстати, альтернативный способ сократить определение функций будет с помощью 'dplyr' /' magrittr': например, 'myhist (.%>% {./3})' или 'myhist (.%>% Sqrt%>% журнал) '. – dash2

Смежные вопросы